要想快速学习Kubernetes,最好的方法就是自己动手搭建一个测试集群,进行实践。
本文我们将基于Kubernetes的部署工具kubeadm,来学习如何搭建一个集群。
01
—
系统环境
1. Kubernetes版本
Kubernetes 版本以 x.y.z 表示,其中 x 是主要版本, y 是次要版本,z 是补丁版本,遵循语义版本控制术语。Kubernetes 社区大约会每隔四个月发布次要版本,社区对于每个版本的支持周期为12个月。
此处我们选择使用较新的1.24.x版本来进行部署演示。
2. 容器运行时
在1.24.x版本中,Kubernetes正式放弃了对dockershim的支持,这也标志着其与Docker的分割。从这个版本开始,我们将无法直接在Kubernetes中使用Docker。
对此,本文将不采用Docker方案,而是以目前主流的Containerd做为容器运行时。
3. 主机环境
在机器配置上,Master节点至少要2 Core和4GB内存,推荐配置是4 Core和16GB。而工作节点则应根据需要运行的业务容器情况进行配置,但通常不少于4 core和16GB内存。
操作系统方面支持Ubuntu、CentOS、RedHat、Debian等常规系统,内核版本要求不低于3.10。
本次演示的节点为一台Master+两台Worker节点的三主机模式,信息如下:
IP地址 |
主机名 |
角色 |
系统版本 |
192.168.214.10 |
k8s-master |
Master |
Ubuntu 20.04 LTS |
192.168.214.21 |
k8s-node1 |
Worker |
Ubuntu 20.04 LTS |
192.168.214.22 |
k8s-node2 |
Worker |
Ubuntu 20.04 LTS |
02
—
初始化设置
在开始部署kubernetes集群前,要先在所有节点上进行初始化工作。
相关步骤如下:
1. 配置hosts文件
192.168.214.10 k8s-master
192.168.214.21 k8s-node1
192.168.214.22 k8s-node2
2. 配置时间同步
$ sudo apt install chrony
$ sudo systemctl start chronyd
3. 禁用Swap
$ sudo swapoff -a #临时禁用
$ sudo sed -i.bak '/swap/s/^/#/' /etc/fstab #永久禁用
使用free -m 可以检查是否生效,正常会看到swap已经为0。
$ free -m
total used free shared buff/cache available
Mem: 3901 320 2673 1 907 3340
Swap: 0 0 0
4. 配置内核参数,用于将桥接的IPv4流量传递到iptables的链
$ sudo tee /etc/modules-load.d/k8s.conf<<EOF
overlay
br_netfilter
EOF
$ sudo modprobe overlay
$ sudo modprobe br_netfilter
$ cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
$ sudo sysctl --system
运行下列命令确认br_netfilter 和 overlay 模块已被加载。
$ lsmod | grep br_netfilter
$ lsmod | grep overlay
运行以下命令确认相关参数已被设置为1。
$ sysctl net.bridge.bridge-nf-call-iptables net.bridge.bridge-nf-call-ip6tables net.ipv4.ip_forward
03
—
安装组件
1. 更新apt源,安装必要软件包
$ sudo apt update
$ sudo apt install -y curl gnupg2 software-properties-common apt-transport-https ca-certificates
2. 配置仓库
由于ubuntu默认源的版本较低,需要从docker官方仓库安装最新版本。
添加Docker官方证书,用于验证程序包签名。
$ curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
添加稳定版本的Docker-CE仓库,由于是国内环境,此处使用阿里云镜像仓库。
$ sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
3. 安装containerd
更新仓库索引并安装containerd
$ sudo apt update
$ sudo apt install -y containerd.io
生成默认配置文件
$ containerd config default | sudo tee /etc/containerd/config.toml
修改/etc/containerd/config.toml配置文件
[plugins."io.containerd.grpc.v1.cri"]
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.6" #改用阿里云仓库镜像
...
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
...
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true # 改为true
启动containerd
$ sudo systemctl start containerd
$ sudo systemctl enable containerd
4. 安装kubelet、kubeadm和kubectl
kubelet是运行在每个节点上的代理服务,kubeadm是集群安装工具,kubectl是集群管理客户端。
在安装前需要先添加Kubernetes仓库,由于国内网络问题,此处还是使用阿里云镜像库。
$ curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -
$ sudo apt-add-repository "deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main"
安装程序
$ sudo apt update
$ sudo apt install -y kubelet=1.24.10-00 kubeadm=1.24.10-00 kubectl=1.24.10-00
# 锁定版本,不自动更新
$ sudo apt-mark hold kubelet kubeadm kubectl
04
—
创建集群
我们在Master主机上执行下列命令,进行集群的初始化工作。
1. 初始化集群
sudo kubeadm init \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.24.10 \
--control-plane-endpoint 192.168.214.10 \
--apiserver-advertise-address 192.168.214.10 \
--pod-network-cidr 10.244.0.0/16
注释:--image-repository 指定要使用的镜像仓库,此处指定阿里云仓库;--kubernetes-version 指定Kubernetes版本;--control-plane-endpoint 指定控制平面的访问端点,可以是IP或DNS名称;--apiserver-advertise-address 指定kube apiserver的地址端口,如果有多台Master节点,则配置为负载均衡地址;--pod-network-cidr指定Pod网段。
2. 当初始化完成后,可以看到如下内容的成功提示:
复制并保存关于kubeadm join 的命令,用于后面加入Worker节点到集群。
...
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
...
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.214.10:6443 --token 8sqxa4.9h7zsfiz9u7r3luz \
--discovery-token-ca-cert-hash sha256:303f0532a0a211183c8382f72ecbb2e93e871a55cc6f6d8e1c286cd34e545dc4
3. 配置集群操作文件
$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
现在我们可以使用kubectl 来管理Kubernetes集群,运行kubectl get nodes 查看节点状态。
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master NotReady control-plane 17m v1.24.10
此时,我们可以看到该节点为NotReady状态,这是因为还有没有部署网络插件的缘故。上一文中我们有说过,网络插件需要在部署过程中手动安装。
4. 安装网络插件
目前,Kubernetes流行的网络插件有Flannel、Calico等,此处安装 Flannel。
$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
可使用kubectl get pod 查看flannel的pod状态,等安装完成后会变成Running状态。
$ kubectl get pod -n kube-flannel
NAME READY STATUS RESTARTS AGE
kube-flannel-ds-4k4pt 1/1 Running 0 3m19s
此时,再查看node节点,可看到状态也恢复 。
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master NotReady control-plane 37m v1.24.10
05
—
添加工作节点
现在,我们可以将其他两个节点做为Worker节点添加到集群中。
在每个节点上运行如下命令:
$ sudo kubeadm join 192.168.214.10:6443 --token 8sqxa4.9h7zsfiz9u7r3luz \
--discovery-token-ca-cert-hash sha256:303f0532a0a211183c8382f72ecbb2e93e871a55cc6f6d8e1c286cd34e545dc4
稍等一会,然后用命令kubectl get nodes 查看节点状态,可看到节点已经正常运行。
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane 126m v1.24.10
k8s-node1 Ready <none> 11m v1.24.10
k8s-node2 Ready <none> 8m55s v1.24.10
当做完这一步时,恭喜你已经成功搭建了一套集群,这是个好的开始。后面,我们的所有功能演示都会在这个集群上进行。