Docker方式部署K8s集群

1.1 集群创建说明

Kubernetes支持多种容器运行时,包括Containerd、Docker和CRI-O。以下是这三种方式的详细说明:

  • Containerd:Containerd是Kubernetes默认使用的容器运行时。它是一个轻量级的容器运行时,专为Kubernetes设计,提供了高效、稳定的容器管理能力。Containerd直接与Kubernetes集群交互,无需额外的桥接层,这使得它在性能和兼容性上都表现出色。

  • Docker:尽管Kubernetes默认情况下已经废弃了对Docker的直接支持,但是通过使用Mirantis维护的cri-dockerd插件,仍然可以实现Kubernetes集群的创建。Docker作为一个全面的容器平台,提供了丰富的功能和强大的社区支持。但是,由于Kubernetes对Docker的直接支持已经停止,因此在使用Docker时可能需要对Kubelet的启动参数进行一些调整,以确保其与Docker容器运行时正确交互。

  • CRI-O:CRI-O是一个专为Kubernetes设计的轻量级容器运行时,它直接实现了Kubernetes的容器运行时接口(CRI)。使用CRI-O创建Kubernetes集群需要安装CRI-O插件,并对Kubelet的启动参数进行配置,以指定CRI-O作为容器运行时。CRI-O专为Kubernetes优化,提供了简单、高效的容器管理功能,是一个很好的选择,特别是对于希望最大化Kubernetes集群性能和资源利用率的用户

注意:

Kubernetes 1.24版本引入了许多新特性和改进,以下是一些重要的更新:

  • 从kubelet中移除dockershim:自1.20版本被弃用之后,dockershim组件终于在1.24的kubelet中被删除。这是确保Kubernetes项目未来发展的必要步骤。从1.24开始,用户需要使用其他受支持的运行时选项,例如containerd或CRI-O。如果选择Docker Engine作为运行时,则需要使用cri-dockerd插件。

  • 关闭测试版API:Kubernetes 1.24版本将一些beta版API标记为废弃,转而使用稳定版API。这是为了确保API的稳定性和向后兼容性。

  • 对发布工件进行签名:为了提高安全性,Kubernetes 1.24版本引入了对发布工件的签名验证。这意味着用户可以验证下载的Kubernetes二进制文件的完整性和来源。

  • OpenAPIv3:Kubernetes 1.24版本引入了对OpenAPIv3的支持,这是一个更现代的API描述规范,提供了更丰富的元数据和更好的API文档生成能力。

  • 正式发布存储容量和卷扩展:Kubernetes 1.24版本正式发布了存储容量和卷扩展的功能,这使得用户可以更灵活地管理存储资源,并支持动态扩展存储卷。

  • NonPreemptingPriority稳定版发布:Kubernetes 1.24版本将NonPreemptingPriority策略升级为稳定版,这使得用户可以在Pod调度时使用更多的优先级控制选项。

  • 存储插件迁移:Kubernetes 1.24版本进一步支持存储插件的迁移,提供了更多的选项和工具来帮助用户迁移到新的存储解决方案。

  • gRPC探针升级为Beta版:Kubernetes 1.24版本将gRPC探针升级为Beta版,这使得用户可以利用gRPC探针进行更高效的健康检查和故障排查。

  • Kubelet证书提供程序升级至beta版:Kubernetes 1.24版本升级了Kubelet证书提供程序到Beta版,这提供了更灵活的证书管理选项,包括自动轮换和更细粒度的权限控制。

  • 上下文日志记录进入alpha阶段:Kubernetes 1.24版本引入了上下文日志记录的alpha阶段,这为用户提供了更多的日志记录选项和灵活性。

  • 避免在向服务分配IP时发生冲突:Kubernetes 1.24版本引入了避免在向服务分配IP时发生冲突的功能,这提高了服务的可用性和稳定性。

1.2 环境规划

kubernetes集群大体上分为两类:一主多从多主多从

  • 一主多从:一台Master节点和多台Node节点,搭建简单,但是有单机故障风险,适合用于测试环境

  • 多主多从:多台Master节点和多台Node节点,搭建麻烦,安全性高,适合用于生产环境

受资源限制,本次环境一主两从

1.3 Kubernetes基础环境部署

kubernetes有多种部署方式,目前主流的方式有kubeadm、minikube、二进制包

  • minikube:一个用于快速搭建单节点kubernetes的工具

  • kubeadm:一个用于快速搭建kubernetes集群的工具

  • 二进制包 :从官网下载每个组件的二进制包,依次去安装,此方式对于理解kubernetes组件更加有效

  • K8s-all:主机名为三台都做

主机名 IP地址 系统 配置
k8s-master-01 192.168.110.21/24 CentOS 7.9 4颗CPU 8G内存 100G硬盘
K8s-node-01 192.168.110.22/24 CentOS 7.9 4颗CPU 8G内存 100G硬盘
K8s-node-02 192.168.110.23/24 CentOS 7.9 4颗CPU 8G内存 100G硬盘

**注意:**关闭防火墙和SElinux

1.1.1 配置hosts解析和免密钥

复制代码
[root@K8s-master-01 ~]# cat >> /etc/hosts << EOF
192.168.110.21 k8s-master-01
192.168.110.22 K8s-node-01
192.168.110.23 K8s-node-02
EOF
[root@K8s-master-01 ~]# scp /etc/hosts K8s-node-01:/etc/
[root@K8s-master-01 ~]# scp /etc/hosts K8s-node-02:/etc/
​
# master节点可以免密钥访问其他节点
[root@k8s-master-01 ~]# ssh-keygen -f ~/.ssh/id_rsa -N '' -q
[root@k8s-master-01 ~]# ssh-copy-id k8s-node-01
[root@k8s-master-01 ~]# ssh-copy-id k8s-node-02

1.1.2 配置NTP时间服务

复制代码
[root@K8s-master-01 ~]# sed -i '3,6 s/^/# /' /etc/chrony.conf
[root@K8s-master-01 ~]# sed -i '6 a server ntp.aliyun.com iburst' /etc/chrony.conf
[root@K8s-master-01 ~]# systemctl restart chronyd.service
[root@K8s-master-01 ~]# chronyc sources
210 Number of sources = 1
MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
^* 201.107.6.88                  2   6    17    18   +266us[+1386us] +/-   24ms
​
[root@K8s-node-01 ~]# sed -i '3,6 s/^/# /' /etc/chrony.conf
[root@K8s-node-01 ~]# sed -i '6 a server ntp.aliyun.com iburst' /etc/chrony.conf
[root@K8s-node-01 ~]# systemctl restart chronyd.service
[root@K8s-node-01 ~]# chronyc sources
210 Number of sources = 1
MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
^* 201.107.6.88                  2   6    17    18   +266us[+1386us] +/-   24ms
​
[root@K8s-node-02 ~]# sed -i '3,6 s/^/# /' /etc/chrony.conf
[root@K8s-node-02 ~]# sed -i '6 a server ntp.aliyun.com iburst' /etc/chrony.conf
[root@K8s-node-02 ~]# systemctl restart chronyd.service
[root@K8s-node-02 ~]# chronyc sources
210 Number of sources = 1
MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
^* 201.107.6.88                  2   6     7     1   -291us[-4455us] +/-   30ms

1.1.3 禁用Swap交换分区

由于容器设计为尽可能高效地使用资源,Kubernetes通常要求在节点上禁用swap分区,原因包括:

  • 性能问题 :如前所述,使用swap会降低系统性能,这可能会影响容器的性能和稳定性。

  • 资源隔离 :禁用swap可以确保容器之间的资源隔离更加清晰,避免一个容器使用过多swap空间而影响其他容器。

  • 调试和监控 :禁用swap可以简化系统监控和调试,因为不需要考虑磁盘空间作为内存使用的复杂性。

复制代码
[root@K8s-master-01 ~]# sed -i 's/.*swap.*/# &/' /etc/fstab
[root@K8s-node-01 ~]# sed -i 's/.*swap.*/# &/' /etc/fstab
[root@K8s-node-02 ~]# sed -i 's/.*swap.*/# &/' /etc/fstab

1.1.4 升级操作系统内核

**注意:**三台机器同时做

复制代码
[root@k8s-all ~]# wget -c http://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/kernel-ml-6.0.3-1.el7.elrepo.x86_64.rpm
[root@k8s-all ~]# wget -c http://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/kernel-ml-devel-6.0.3-1.el7.elrepo.x86_64.rpm
  • 安装并设置启动顺序
复制代码
[root@k8s-all ~]# rpm -ivh kernel-ml-6.0.3-1.el7.elrepo.x86_64.rpm
[root@k8s-all ~]# rpm -ivh kernel-ml-devel-6.0.3-1.el7.elrepo.x86_64.rpm
[root@k8s-all ~]# awk -F\' '$1=="menuentry " {print $2}' /etc/grub2.cfg
CentOS Linux (6.0.3-1.el7.elrepo.x86_64) 7 (Core)
CentOS Linux (1.10.0-1160.119.1.el7.x86_64) 7 (Core)
CentOS Linux (1.10.0-1160.71.1.el7.x86_64) 7 (Core)
CentOS Linux (0-rescue-35f6b014eff0419881bbf71f1d9d4943) 7 (Core)
[root@k8s-all ~]# grub2-set-default 0
  • 重启生效
复制代码
[root@k8s-all ~]# reboot
[root@k8s-all ~]# uname -r
6.0.3-1.el7.elrepo.x86_64

1.1.5 开启内核路由转发

复制代码
[root@K8s-all ~]# sysctl -w net.ipv4.ip_forward=1
net.ipv4.ip_forward = 1
[root@K8s-all ~]# modprobe br_netfilter
[root@k8s-all ~]# echo net.ipv4.ip_forward = 1 >> /etc/sysctl.conf 
[root@k8s-all ~]# sysctl -p
net.ipv4.ip_forward = 1

1.1.6 添加网桥过滤及内核转发配置文件

复制代码
[root@K8s-all ~]# cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
vm.swappiness = 0
EOF
[root@K8s-all ~]# modprobe br-netfilter
[root@K8s-all ~]# sysctl -p /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
vm.swappiness = 0

1.1.7 开启IPVS

复制代码
[root@K8s-all ~]# yum install ipset ipvsadm -y
[root@K8s-all ~]# cat >> /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
​
ipvs_modules="ip_vs ip_vs_lc ip_vs_wlc ip_vs_rr ip_vs_wrr ip_vs_lblc ip_vs_lblcr ip_vs_dh ip_vs_vip ip_vs_sed ip_vs_ftp nf_conntrack"
​
for kernel_module in $ipvs_modules; 
do
        /sbin/modinfo -F filename $kernel_module >/dev/null 2>&1
        if [ $? -eq 0 ]; then
                /sbin/modprobe $kernel_module
        fi
done
​
chmod 755 /etc/sysconfig/modules/ipvs.modules
EOF
​
[root@K8s-all ~]# bash /etc/sysconfig/modules/ipvs.modules

1.1.8 配置国内镜像源

复制代码
[root@K8s-all ~]# cat >> /etc/yum.repos.d/kubernetes.repo <<EOF
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

1.1.9 安装软件包

复制代码
[root@K8s-all ~]# yum install kubeadm kubelet kubectl -y
[root@k8s-all ~]# kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"28", GitVersion:"v1.28.2", GitCommit:"89a4ea3e1e4ddd7f7572286090359983e0387b2f", GitTreeState:"clean", BuildDate:"2023-09-13T09:34:32Z", GoVersion:"go1.20.8", Compiler:"gc", Platform:"linux/amd64"}

#为了实现docker使用的cgroupdriver与kubelet使用的cgroup的一致性,修改如下文件内容
[root@K8s-all ~]# cat <<EOF > /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"
EOF

[root@K8s-all ~]# systemctl enable kubelet.service --now

1.1.10 kubectl命令自动补全

复制代码
[root@K8s-all ~]# yum install -y bash-completion
[root@K8s-all ~]# source /usr/share/bash-completion/bash_completion
[root@K8s-all ~]# source <(kubectl completion bash)
[root@K8s-all ~]# echo "source <(kubectl completion bash)" >> ~/.bashrc
  • 做完基础环境,创建快照,后续会分别使用四种不同方式创建集群。
复制代码
[[root@K8s-master-01 ~]# kubectl get nodes  #状态为Ready
NAME             STATUS   ROLES           AGE   VERSION
k8s-master-01    Ready    control-plane   12m   v1.28.2
k8s-node-01      Ready    <none>          11m   v1.28.2
k8s-node-02      Ready    <none>          11m   v1.28.2
​
[root@K8s-master-01 ~]# kubectl get pods -n kube-system   #网络正常,如果没用全部Running就稍等片刻
NAME                                       READY   STATUS    RESTARTS   AGE
calico-kube-controllers-658d97c59c-qcht6   1/1     Running   0          10m
calico-node-gqx2x                          1/1     Running   0          10m
calico-node-rj64n                          1/1     Running   0          10m
calico-node-xkphs                          1/1     Running   0          10m
coredns-66f779496c-rvgqq                   1/1     Running   0          13m
coredns-66f779496c-vvxxk                   1/1     Running   0          13m
etcd-k8s-master-01                         1/1     Running   0          13m
kube-apiserver-k8s-master-01               1/1     Running   0          13m
kube-controller-manager-k8s-master-01      1/1     Running   0          13m
kube-proxy-dw4tq                           1/1     Running   0          11m
kube-proxy-n6x4f                           1/1     Running   0          11m
kube-proxy-pc8tq                           1/1     Running   0          13m
kube-scheduler-k8s-master-01               1/1     Running   0          13m

1.5 Docker方式部署K8s集群

注意 :基于1.3 Kubernetes基础环境部署

1.5.1 Docker安装部署

1.5.1.1 安装镜像源
复制代码
[root@K8s-all ~]# wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.huaweicloud.com/docker-ce/linux/centos/docker-ce.repo
[root@K8s-all ~]# sed -i 's+download.docker.com+mirrors.huaweicloud.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
[root@K8s-all ~]# sed -i 's/$releasever/7Server/g' /etc/yum.repos.d/docker-ce.repo
1.5.1.2 安装Docker-ce
复制代码
[root@K8s-all ~]# yum install docker-ce -y
1.5.1.3 配置镜像加速器
复制代码
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://lfhqfxbn.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
​
[root@K8s-all ~]# docker --version
Docker version 20.10.21, build baeda1f

1.5.2 安装cri-dockererd插件

注意:K8s从1.24版本后不支持docker了所以这里需要用cri-dockererd

下载地址:https://github.com/Mirantis/cri-dockerd/releases/download/

复制代码
[root@K8s-all ~]# wget -c https://github.com/Mirantis/cri-dockerd/releases/download/v0.1.13/cri-dockerd-0.1.13-1.el7.x86_64.rpm
[root@K8s-all ~]# yum install cri-dockerd-0.1.13-1.el7.x86_64.rpm -y
[root@K8s-all ~]# sed -i 's#^ExecStart=.*#ExecStart=/usr/bin/cri-dockerd --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:1.9#' /usr/lib/systemd/system/cri-docker.service
[root@K8s-all ~]# systemctl daemon-reload
[root@K8s-all ~]# systemctl restart docker
[root@K8s-all ~]# systemctl enable --now cri-docker.service

1.5.3 初始化Master节点

复制代码
[root@K8s-master-01 ~]# kubeadm init --kubernetes-version=v1.28.2 --pod-network-cidr=10.224.0.0/16 --apiserver-advertise-address=192.168.110.21 --apiserver-bind-port=6443 --cri-socket unix:///var/run/cri-dockerd.sock --image-repository registry.aliyuncs.com/google_containers
​
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
​
Alternatively, if you are the root user, you can run:
​
  export KUBECONFIG=/etc/kubernetes/admin.conf
​
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/
​
Then you can join any number of worker nodes by running the following on each as root:
​
kubeadm join 192.168.110.21:6443 --token p6zmgi.oepmiwbmg61704br \
        --discovery-token-ca-cert-hash sha256:4688b4812501fe5b1e7d545ba2d7f4f077cf22ef9a139bf9e7229f2109354898
        
[root@K8s-master-01 ~]# mkdir -p $HOME/.kube
[root@K8s-master-01 ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@K8s-master-01 ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
[root@K8s-master-01 ~]# export KUBECONFIG=/etc/kubernetes/admin.conf

1.5.4 添加Worker节点

**注意:**加入集群时需要添加 --cri-socket unix:///var/run/cri-dockerd.sock

复制代码
[root@K8s-node-01 ~]# kubeadm join 192.168.110.21:6443 --token p6zmgi.oepmiwbmg61704br \
--discovery-token-ca-cert-hash sha256:4688b4812501fe5b1e7d545ba2d7f4f077cf22ef9a139bf9e7229f2109354898 \
--cri-socket unix:///var/run/cri-dockerd.sock
​
[root@K8s-node-02 ~]# kubeadm join 192.168.110.21:6443 --token p6zmgi.oepmiwbmg61704br \
--discovery-token-ca-cert-hash sha256:4688b4812501fe5b1e7d545ba2d7f4f077cf22ef9a139bf9e7229f2109354898 \
--cri-socket unix:///var/run/cri-dockerd.sock

1.5.5 查看集群

复制代码
[root@K8s-master-01 ~]# kubectl get nodes
NAME             STATUS     ROLES           AGE    VERSION
k8s-master-01    NotReady   control-plane   6m1s   v1.28.2
k8s-node-01      NotReady   <none>          91s    v1.28.2
k8s-node-02      NotReady   <none>          104s   v1.28.2

1.5.6 安装网络插件

复制代码
[root@k8s-all ~]# docker pull docker.io/calico/cni:v1.25.0
[root@k8s-all ~]# docker pull docker.io/calico/node:v1.25.0
[root@k8s-all ~]# docker pull docker.io/calico/kube-controllers:v1.25.0
​
[root@k8s-master-01 ~]# wget -c https://gitee.com/kong-xiangyuxcz/svn/releases/download/V1.25.0/calico.yaml
​
[root@k8s-master-01 ~]# kubectl apply -f calico.yaml

1.5.7 检查

复制代码
[root@K8s-master-01 ~]# kubectl get nodes  #状态为Ready
NAME             STATUS   ROLES           AGE   VERSION
k8s-master-01    Ready    control-plane   12m   v1.28.2
k8s-node-01      Ready    <none>          11m   v1.28.2
k8s-node-02      Ready    <none>          11m   v1.28.2
​
[root@K8s-master-01 ~]# kubectl get pods -n kube-system   #网络正常,如果没用全部Running就稍等片刻
NAME                                       READY   STATUS    RESTARTS   AGE
calico-kube-controllers-658d97c59c-qcht6   1/1     Running   0          10m
calico-node-gqx2x                          1/1     Running   0          10m
calico-node-rj64n                          1/1     Running   0          10m
calico-node-xkphs                          1/1     Running   0          10m
coredns-66f779496c-rvgqq                   1/1     Running   0          13m
coredns-66f779496c-vvxxk                   1/1     Running   0          13m
etcd-k8s-master-01                         1/1     Running   0          13m
kube-apiserver-k8s-master-01               1/1     Running   0          13m
kube-controller-manager-k8s-master-01      1/1     Running   0          13m
kube-proxy-dw4tq                           1/1     Running   0          11m
kube-proxy-n6x4f                           1/1     Running   0          11m
kube-proxy-pc8tq                           1/1     Running   0          13m
kube-scheduler-k8s-master-01               1/1     Running   0          13m
相关推荐
gs8014016 分钟前
安装node 报错需要:glibc >= 2.28
linux·服务器·前端·node.js
何老生3 小时前
Linux之MySQL主从复制
linux·运维·mysql
ggdpzhk3 小时前
图片详解,最简单易懂!!!Ubuntu增强功能
linux·ubuntu
运维开发那些事3 小时前
k8s service如何实现流量转发
云原生·容器·kubernetes
神奇椰子3 小时前
Ubuntu 常用指令和作用解析
linux·运维·ubuntu·centos·云计算·代码规范·浪浪云
xcato4 小时前
k8s笔记
笔记·容器·kubernetes
望获linux4 小时前
Linux网络协议栈的实现
linux·服务器·arm开发·网络协议·操作系统·嵌入式操作系统
树欲静而风不止丶4 小时前
【Ubuntu】安装常用软件包
linux·ubuntu
lagransun4 小时前
Linux内核学习之 -- 系统调用open()和write()的实现笔记
linux·笔记·学习
可儿·四系桜4 小时前
如何在Linux虚拟机上安装和配置JDK
java·linux·运维