目 录
1 Kubernetes架构简介 1
2 集群设计 2
2.1 网络拓扑 2
2.2 节点规划 2
3 安装准备 3
3.1 基础安装 3
3.2 主机名修改 4
3.3 修改IP地址 4
3.4 配置hosts静态解析 4
3.5 修改cgroup driver类型 4
3.6 配置k8s的yum源 5
3.7 修改k8s的内核参数 5
4 kubeadm部署工具安装 5
4.1 查看可用版本 5
4.2 安装和配置 6
4.3 关闭SWAP分区 6
4.4 命令行补齐 6
5 创建其它node节点 7
6 Kubernetes集群初始化 8
6.1 了解初始化参数 8
6.2 执行初始化命令 8
6.3 配置客户端认证 9
6.4 添加node节点 9
6.5 安装网络插件 9
7 验证集群 10
7.1 验证集群状态 10
7.2 查看pods状态 11
8 发布应用 11
分布式存储-第2期
(kubernetes之kubeadm安装)
元工:2022.07.05
背景:最近大家对容器技术的讨论越来越多,兴趣也越来越浓,容器的应用场景也非常之多,其中在分布式系统应用领域更突显它的优势和魅力,本文是工作之余所做相关实验的整理,供大家一起学习和分享。
目标:在仅有的一台工作电脑上搭建全能型虚拟化容器平台,并在其上运行目前主流的分布式存储系统(如:Ceph、Minio、GlusterFS等)作为应用场景进行全方位体验和学习。
亮点:kubernetes的社区版本更新特别快,每隔3~6个月就会有新版本,本文力求通过一个通用且可指定版本的方法来安装部署K8S集群;最后会按本文所述从头至尾重新做了一遍,以确保本文内容百分百的正确性和百分百的完整性。
价值:减少学习的硬件成本、减少学习目标前面的障碍、化天堑为通途;不仅是学习容器技术的入门宝典,也为学习分布式存储系统的同学提供了实验环境准备的方法。
使用要求:对Linux、VMware workstaion有一定的熟悉,祝您使用愉快!
Kubernetes架构简介
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5SMlVjYzITNiVWZ4kzLcBTMyIDMy8CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
kubernetes项目架构就是master节点和worker两种节点组成,控制节点即Master 节点,由三个紧密协作的独立组件组合而成,它们分别是负责 API 服务的kube-apiserver、负责调度的 kube-scheduler,以及负责容器编排的 kube-controller-manager。
集群设计
网络拓扑
网络设计详细情况请参考第1期第2章节的内容,拓扑如下图所示:
|
节点规划
虚拟机 | 节点名称 | IP地址 | 角色 | 服务组件 |
K8S | node1 | 192.168.66.11 | Master | kube-apiserver kube-scheduler kube-controller-manager etcd、kubelet、kube-proxy,kubeadm, flannel,docker |
K8S02 | node2 | 192.168.66.12 | worker | kubelet,kube-proxy,flannel,docker |
K8S03 | node3 | 192.168.66.13 | worker | kubelet,kube-proxy,flannel,docker |
K8S04 | node4 | 192.168.66.14 | worker | kubelet,kube-proxy,flannel,docker |
安装准备
基础安装
基础安装包括虚拟机的操作系统和容器引擎的安装:1)CentOS系统安装:请参考第1期第3章节的内容;2)Docker安装:请参考第1期第4章节的内容。或者,如果你完成第1期第4章节的实验内容后并做了快照,则可直接基于该快照克隆一个新虚拟机,方法如下:
1)右键单击虚拟机(如:Docker),依次选择菜单项“管理->克隆”,如下图所示:
2)在弹出的“克隆虚拟机向导”窗口中,点击“下一步”按钮进入“克隆源”步骤,选择“现有快照”在下拉列表中选择包含了Docker安装的快照版本(如:快照1),点击“下一步”按钮进入“克隆类型”步骤,选择“创建完整克隆”,再点击“下一步”直到完成虚拟机(如: K8S)的创建。
| |
主机名修改
// 以node1为例: [root@K8S ~]# hostnamectl set-hostname node1 && bash |
修改IP地址
// 以node1为例: [root@node1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33 ... IPADDR="192.168.66.11" ... // 重启网络服务 [root@node1 ~]# systemctl restart network |
配置hosts静态解析
// 每个节点都要配置 [root@node1 ~]# vim /etc/hosts 192.168.66.11 node1 192.168.66.12 node2 192.168.66.13 node3 192.168.66.14 node4 |
修改cgroup driver类型
// 在daemon.json中,cgroupdriver的类型为“systemd” [root@node1 ~]# vim /etc/docker/daemon.json { "registry-mirrors": ["https://6wu5f3fc.mirror.aliyuncs.com","https://registry.docker-cn.com","https://docker.mirrors.ustc.edu.cn","https://dockerhub.azk8s.cn","http://hub-mirror.c.163.com"], "exec-opts": ["native.cgroupdriver=systemd"] } // 重启docker使之生效 [root@node1 ~]# systemctl restart docker // 验证结果 [root@node1 ~]# docker info Server Version: 20.10.16 Storage Driver: overlay2 Backing Filesystem: xfs Supports d_type: true Native Overlay Diff: true userxattr: false Logging Driver: json-file Cgroup Driver: systemd Cgroup Version: 1 |
配置k8s的yum源
[root@node1 ~]# cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ enabled=1 gpgcheck=0 repo_gpgcheck=0 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF |
修改k8s的内核参数
// 加载 br_netfilter 模块 [root@node1 ~]# cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf br_netfilter EOF //开启ip_forward转发参数 [root@node1 ~]# cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 EOF // 手动加载所有的配置文件 [root@node1 ~]# sysctl --system |
kubeadm部署工具安装
查看可用版本
[root@node1 ~]# yum list --showduplicates | grep kubeadm |
kubeadm需要和接下来要安装的K8S的版本一致,至于当前为什么选择1.23.X版本在第1期中已经解释,当时版本还是1.23.6,不到一个月就更新到了1.23.8版本,同时1.24.X大版本也更新到了1.24.2,如果不指定版本,默认安装的最新版本就是它,再次也说明了指定版本安装方法的意义。
安装和配置
// 安装最新的成熟稳定版本,即v1.23.8 [root@node1 ~]# yum install -y kubeadm-1.23.8 kubectl-1.23.8 kubelet-1.23.8 // 设置开机启动 [root@node1 ~]# systemctl enable kubelet // 查看kubeadm版本 [root@node1 ~]# kubeadm version // 查看kubelet的状态,因目前还没初始化,即使执行"systemctl restart kubelet"也无效 [root@node1 ~]# systemctl status kubelet |
关闭SWAP分区
// 永久关闭:注释掉"/etc/fstab"的最后一行 [root@node1 ~]# vim /etc/fstab /dev/mapper/centos-root / xfs defaults 0 0 UUID=00974e16-e0a5-4510-87ee-3379af272347 /boot xfs defaults 0 0 #/dev/mapper/centos-swap swap swap defaults 0 0 // 临时关闭:将/etc/fstab文件中所有设置为swap的设备关闭 [root@node1 ~]# swapoff -a // 查看内存使用情况 [root@node1 ~]# free -m |
命令行补齐
[root@node1 ~]# yum install bash-completion -y [root@node1 ~]# source /usr/share/bash-completion/bash_completion [root@node1 ~]# kubectl completion bash >/etc/profile.d/kubectl.sh [root@node1 ~]# source /etc/profile.d/kubectl.sh [root@node1 ~]# echo "source /etc/profile.d/kubectl.sh" >>.bashrc |
创建其它node节点
因仅需在Master节点(即node1)上执行Kubeadm init初始化,建议此时此处做个快照备份,也可以作为其它node节点虚拟机的基础镜像,不用再重复以上的步骤。
类似章节4.1中的方法:右键单击节点Node1的虚拟机(如:CS01,必须关机状态),选择“管理->克隆”菜单项,不同的是这里克隆方法建议选择“创建链接克隆”,更节省磁盘空间,如下图所示。
根据以上方法,创建出其它3个node节点的虚拟机(如:CS02、CS03、CS03),并依照章节3.2、3.3的方法修改它们的主机名(如:node2,node3,node4)和IP地址。
通过Ping 命令检查节点之间的网络是否连接OK,如下:
[root@node1 ~]# ping node2 [root@node1 ~]# ping node3 [root@node1 ~]# ping node4 |
Kubernetes集群初始化
了解初始化参数
[root@node1 ~]# kubeadm init --help // 常⻅参数: --kubernetes-version kubernetes的版本,默认是最新版本 --apiserver-advertise-address apiserver的地址,默认会选择访问外⽹的地址 --apiserver-bind-port apiserver访问端⼝,默认为6443 --image-repository registry.aliyuncs.com/google_containers 国内⽆法访问gcr.io仓库,指定阿⾥云仓库,⽆须翻墙【可选】 --pod-network-cidr 指定pod段访问的地址段,根据⽹络插件的不同(可以根据需要修改) |
执行初始化命令
[root@node1 ~]# kubeadm init --kubernetes-versinotallow="v1.23.8" --apiserver-advertise-address 192.168.66.11 --apiserver-bind-port 6443 --pod-network-cidr 172.16.0.0/16 --image-repository registry.aliyuncs.com/google_containers // 结果如下: |
配置客户端认证
// 根据上一步执行结果中的任务提示(1)进行操作 [root@node1 ~]# mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config // 验证结果:这时只有⼀个节点 [root@node1 ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION node1 NotReady control-plane,master 16m v1.23.8 |
添加node节点
// 根据章节6.2执行结果中的任务提示(3),依次在node2~node4上执行下面操作,将自身作为worker node加入到K8S集群(以node2为例): [root@node2 ~]# kubeadm join 192.168.66.11:6443 --token w1mzlm.9iru5wptr4s7e6i6 \ --discovery-token-ca-cert-hash sha256:60abb7c3b8ade5cb2032265ac8e5801219d9a1ac8b218544fdb47490da80b203 结果如下: //在node-1上查看node的情况:都加入成功,但状态是NotReady,原因是还没安装网络插件。 [root@node1 ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION node1 NotReady control-plane,master 16m v1.23.8 node2 NotReady <none> 74s v1.23.8 node3 NotReady <none> 67s v1.23.8 node4 NotReady <none> 60s v1.23.8 |
安装网络插件
依据章节6.2执行结果中的任务提示(2),访问下面网站https://kubernetes.io/docs/concepts/cluster-administration/addons/,选择你想要安装的网络插件,本文选择flannel网络插件进行介绍,并且不采用其默认的IP网段地址。
For Kubernetes v1.17+ Make sure a flanneld binary exists at /opt/bin/flanneld on each node kubectl apply -fhttps://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml If you use custom podCIDR (not 10.244.0.0/16) you first need to download the above manifest and modify the network to match your one. |
下载kube-flannel.yml后,修改Network为172.16.0.0/16(默认10.244.0.0/16),保存在命令执行的当前目录。
1)安装flannel插件
// 仅需在Master节点上执行 [root@node1 ~]# kubectl apply -f kube-flannel.yml |
2)部署需要拉取镜像,需要点时间,通过下面方法查看flannel部署的情况
// 如下:在kube-system命名空间中部署了4个flannel、4个Proxy等等 [root@node1 ~]# kubectl get pods -n kube-system |
3)校验node节点状态
// 再来查看节点的状态,这时都变为"Ready"了,说明安装成功! [root@node1 ~]# kubectl get nodes |
验证集群
验证集群状态
[root@node1 ~]# kubectl get cs |
查看pods状态
// K8S相关的组件都是以容器pods方式部署在命名空间kube-system中的。 [root@node1 ~]# kubectl get pods -n kube-system |
kube-proxy和kube-flannel均由4个pods组成,在每个节点各部署1个,这是通过DaemonSets这类⾼级控制器实现的。
[root@node1 ~]# kubectl get daemonsets.apps -n kube-system |
发布应用
1)发布⼀个nginx的webserver容器
[root@node1 ~]# kubectl create deployment demo --image=nginx:1.19.2-alpine --replicas 3 // 查看pods的部署情况 [root@node1 ~]# kubectl get deployments.apps |
2)将应⽤通过service暴露
[root@node1 ~]# kubectl expose deployment demo --port=80 --target-port=80 |
3)查看service的vip
[root@node1 ~]# kubectl get services |
4)访问微服务应⽤
[root@node1 ~]# curl http://10.101.228.102 |