一、架构图
如下图所示:
二、环境信息
主机名 | K8S版本 | 系统版本 | 内核版本 | IP地址 | 备注 |
---|---|---|---|---|---|
k8s-master-62 | 1.24.12 | Ubuntu 20.04.5 LTS | 5.15.0-69-generic | 192.168.1.62 | master节点 |
k8s-worker-63 | 1.24.12 | Ubuntu 20.04.5 LTS | 5.15.0-69-generic | 192.168.1.63 | worker节点 |
k8s-worker-64 | 1.24.12 | Ubuntu 20.04.5 LTS | 5.15.0-69-generic | 192.168.1.64 | worker节点 |
三、安装和配置先决条件
3.1、主机名设置
说明:分别在对应的节点IP上设置主机名。
root@lolaage-virtual-machine:~# hostnamectl set-hostname k8s-master-62
root@lolaage-virtual-machine:~# hostnamectl set-hostname k8s-worker-63
root@lolaage-virtual-machine:~# hostnamectl set-hostname k8s-worker-64
3.2、配置主机hosts
说明:以下操作无论是master节点和worker节点均需要执行。
root@k8s-master-62:~# vim /etc/hosts
192.168.1.62 k8s-master-62
192.168.1.63 k8s-worker-63
192.168.1.64 k8s-worker-64
3.3、关闭防火墙
说明:以下操作无论是master节点和worker节点均需要执行。
root@k8s-master-62:~# ufw status
root@k8s-master-62:~# ufw disable
3.4、关闭selinux
说明:以下操作无论是master节点和worker节点均需要执行。
root@k8s-master-62:~# apt install selinux-utils
root@k8s-master-62:~# apt install policycoreutils
root@k8s-master-62:~# sed -i 's#SELINUX=permissive#SELINUX=disabled#g' /etc/selinux/config
root@k8s-master-62:~# sestatus -v
说明:如果selinux默认关闭则无需修改。
3.5、关闭swap分区
说明:以下操作无论是master节点和worker节点均需要执行。
root@k8s-master-62:~# swapoff -a
root@k8s-master-62:~# sed -i 's/^\/swapfile\(.*\)$/#\/swapfile \1/g' /etc/fstab
3.6、时间时区同步
说明:以下操作无论是master节点和worker节点均需要执行。
1、设置时区为Asia/Shanghai,如果已经是则请忽略
root@k8s-master-62:~# timedatectl
Local time: 五 2023-03-31 14:11:36 CST
Universal time: 五 2023-03-31 06:11:36 UTC
RTC time: 五 2023-03-31 06:11:36
Time zone: Asia/Shanghai (CST, +0800)
System clock synchronized: yes
NTP service: active
RTC in local TZ: no
2、使用chrony同步时间
root@k8s-master-62:~# apt install chrony -y
root@k8s-master-62:~# vim /etc/chrony/chrony.conf
server ntp.aliyun.com minpoll 4 maxpoll 10 iburst
server ntp1.aliyun.com minpoll 4 maxpoll 10 iburst
#pool ntp.ubuntu.com iburst maxsources 4
#pool 0.ubuntu.pool.ntp.org iburst maxsources 1
#pool 1.ubuntu.pool.ntp.org iburst maxsources 1
#pool 2.ubuntu.pool.ntp.org iburst maxsources 2
root@k8s-master-62:~# systemctl enable chronyd.service
root@k8s-master-62:~# systemctl restart chronyd.service
root@k8s-master-62:~# systemctl status chronyd.service
阿里云NTP服务器地址列表,状态检测如下所示:
然后就是chrony客户端上的一些常用命令:
#查看可用的时间同步源
chronyc sources -v
#查看时间同步源的状态
chronyc sourcestats -v
#对客户端系统时间进行强制同步
chronyc -a makestep
3.7、修改内核参数
说明:以下操作无论是master节点和worker节点均需要执行。
说明:有一些ipv4的流量不能走iptables链,因为linux内核的一个过滤器,每个流量都会经过他,然后再匹配是否可进入当前应用进程去处理,所以会导致流量丢失。配置k8s.conf文件,如下所示:
root@k8s-master-62:~# cat <<EOF | tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
root@k8s-master-62:~# modprobe overlay
root@k8s-master-62:~# modprobe br_netfilter
# 设置所需的sysctl参数,参数在重新启动后保持不变
root@k8s-master-62:~# cat <<EOF | 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
# 应用sysctl参数而不重新启动
root@k8s-master-62:~# sysctl --system
3.8、启用IPVS模式
说明:以下操作无论是master节点和worker节点均需要执行。
说明:ube-proxy开启ipvs的前提需要加载以下的内核模块
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack_ipv4
注意:如果出现modprobe: FATAL: Module nf_conntrack_ipv4 not found in directory /lib/modules/5.15.0-69-generic错误,这是因为使用了高内核,当前内核版本为5.15.0-69-generic,在高版本内核已经把nf_conntrack_ipv4替换为nf_conntrack了。
# 1、安装ipvs
root@k8s-master-62:~# apt -y install ipvsadm ipset sysstat conntrack
# 2、加载内核模块脚本
root@k8s-master-62:~# cat > /etc/profile.d/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
EOF
chmod 755 /etc/profile.d/ipvs.modules
#3、执行加载模块脚本
bash /etc/profile.d/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
四、安装containerd
说明:以下操作无论是master节点和worker节点均需要执行。
kubernetes 1.24.x以后版本默认CRI为containerd,cri称之为容器运行时插件。
方式一、二进制安装
方式二、apt工具安装
1、安装软件包
root@k8s-master-62:~# apt install containerd -y
2、生成默认配置文件
root@k8s-master-62:~# mkdir -p /etc/containerd&& containerd config default > /etc/containerd/config.toml
3、配置systemd cgroup驱动
root@k8s-master-62:~# sed -i 's#SystemdCgroup = false#SystemdCgroup = true#g' /etc/containerd/config.toml
4、重载沙箱(pause)镜像
root@k8s-master-62:~# sed -i 's#sandbox_image = "registry.k8s.io/pause:3.6"#sandbox_image = "registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.7"#g' /etc/containerd/config.toml
5、重启containerd服务并设置开机自启
root@k8s-master-62:~# systemctl restart containerd && systemctl enable containerd
说明:由于网络问题,无法下载国外的K8S镜像,所以这里使用阿里云的镜像仓库地址registry.cn-hangzhou.aliyuncs.com/google_containers代替。如果你有阿里云的账号,可以对 containerd配置镜像加速地址来实现快速下载镜像。
五、安装kubelet、kubeadm和kubectl
说明:以下操作无论是master节点和worker节点均需要执行。
1、安装使用Kubernetes apt仓库所需要的包
root@k8s-master-62:~# apt-get install -y apt-transport-https ca-certificates curl
2、编辑镜像源文件,加入阿里云k8s镜像源配置
root@k8s-master-62:~# cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
3、编辑镜像源文件,加入阿里云k8s镜像源配置
root@k8s-master-62:~# curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add
4、更新源
root@k8s-master-62:~# apt-get update
5、安装指定版本kubeadm、kubelet、kubectl
root@k8s-master-62:~# apt-get install -y kubelet=1.24.12-00 kubeadm=1.24.12-00 kubectl=1.24.12-00
六、k8s镜像下载
说明:以下操作无论是master节点和worker节点均需要执行。
1、查看需要下载的镜像
registry.k8s.io/kube-apiserver:v1.24.12
registry.k8s.io/kube-controller-manager:v1.24.12
registry.k8s.io/kube-scheduler:v1.24.12
registry.k8s.io/kube-proxy:v1.24.12
registry.k8s.io/pause:3.7
registry.k8s.io/etcd:3.5.6-0
registry.k8s.io/coredns/coredns:v1.8.6
2、下载相关镜像
#!/bin/bash
k8s_version=v1.24.12
pause_version=3.7
etcd_version=3.5.6-0
coredns_version=v1.8.6
registry_address=registry.cn-hangzhou.aliyuncs.com/google_containers
ctr image pull --all-platforms ${registry_address}/kube-apiserver:${k8s_version}
ctr image pull --all-platforms ${registry_address}/kube-controller-manager:${k8s_version}
ctr image pull --all-platforms ${registry_address}/kube-scheduler:${k8s_version}
ctr image pull --all-platforms ${registry_address}/kube-proxy:${k8s_version}
ctr image pull --all-platforms ${registry_address}/pause:${pause_version}
ctr image pull --all-platforms ${registry_address}/etcd:${etcd_version}
ctr image pull --all-platforms ${registry_address}/coredns:${coredns_version}
3、将镜像并打包成tar.gz格式
#!/bin/bash
k8s_version=v1.24.12
pause_version=3.7
etcd_version=3.5.6-0
coredns_version=v1.8.6
registry_address=registry.cn-hangzhou.aliyuncs.com/google_containers
ctr image export --all-platforms kube-apiserver-${k8s_version}.tar.gz ${registry_address}/kube-apiserver:${k8s_version}
ctr image export --all-platforms kube-controller-manager-${k8s_version}.tar.gz ${registry_address}/kube-controller-manager:${k8s_version}
ctr image export --all-platforms kube-scheduler-${k8s_version}.tar.gz \${registry_address}/kube-scheduler:${k8s_version}
ctr image export --all-platforms kube-proxy-${k8s_version}.tar.gz ${registry_address}/kube-proxy:${k8s_version}
ctr image export --all-platforms pause-${pause_version}.tar.gz ${registry_address}/pause:${pause_version}
ctr image export --all-platforms etcd-${etcd_version}.tar.gz ${registry_address}/etcd:${etcd_version}
ctr image export --all-platforms coredns-${coredns_version}.tar.gz ${registry_address}/coredns:${coredns_version}
说明:由于网络问题,无法访问registry.k8s.io镜像仓库地址,这里使用国内阿里云的镜像仓库来下载k8s镜像。如果你的是专网环境,请找一台能访问阿里云镜像仓库的服务器下载然后打包成tar.gz格式,上传到要部署的专网服务器,通过ctr image import命令导入镜像即可。
七、calico镜像及yml文件下载
calico 3.25版本对应K8S版本,如下图所示:
1、支持系统
RedHat Linux 7
CentOS 7
CoreOS Container Linux stable
Ubuntu 16.04
Debian 8
2、支持k8s版本
v1.23
v1.24
v1.25
v1.26
1、calico.yml文件下载
说明:以下操作只需要在master节点执行。
root@k8s-master-62:~# wget https://docs.tigera.io/archive/v3.25/manifests/calico.yaml
root@k8s-master-62:~# grep "image:" calico.yaml
image: docker.io/calico/cni:v3.25.0
image: docker.io/calico/cni:v3.25.0
image: docker.io/calico/node:v3.25.0
image: docker.io/calico/node:v3.25.0
image: docker.io/calico/kube-controllers:v3.25.0
2、calico相关镜像下载
说明:以下操作无论是master节点和worker节点均需要执行。
#!/bin/bash
calico_version=v3.25.0
ctr image pull --all-platforms docker.io/calico/cni:${calico_version}
ctr image pull --all-platforms docker.io/calico/node:${calico_version}
ctr image pull --all-platforms docker.io/calico/kube-controllers:${calico_version}
ctr image export --all-platforms cni-${calico_version}.tar.gz \
docker.io/calico/cni:${calico_version}
ctr image export --all-platforms node-${calico_version}.tar.gz \
docker.io/calico/node:${calico_version}
ctr image export --all-platforms kube-controllers-${calico_version}.tar.gz \
docker.io/calico/kube-controllers:${calico_version}
七、使用kubeadm init初始化集群
说明:以下操作仅在master节点执行。
1、生成默认kubeadm初始化config文件
root@k8s-master-62:~# kubeadm config print init-defaults > kubeadm.yaml
2、修改kubeadm默认config文件
root@k8s-master-62:~# vim kubeadm.yaml
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
localAPIEndpoint:
advertiseAddress: 192.168.1.62
bindPort: 6443
apiServer:
extraArgs:
service-node-port-range: 30000-36000
imageRepository: "registry.cn-hangzhou.aliyuncs.com/google_containers"
kubernetesVersion: 1.24.12
networking:
dnsDomain: cluster.local
podSubnet: 10.48.0.0/16
serviceSubnet: 10.96.0.0/16
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
3、使用kubeadm init初始化集群
root@k8s-master-62:~# kubeadm init --config=kubeadm.yaml
如下图所示:
4、对kubectl进行授权,这样kubectl命令可以使用这个证书对k8s集群进行管理
root@k8s-master-62:~# mkdir -p $HOME/.kube
root@k8s-master-62:~# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
root@k8s-master-62:~# chown $(id -u):$(id -g) $HOME/.kube/config
root@k8s-master-62:~# export KUBECONFIG=/etc/kubernetes/admin.conf
root@k8s-master-62:~# echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> /etc/profile
root@k8s-master-62:~# source /etc/profile
5、安装网络插件Calico
root@k8s-master-62:~# kubectl apply -f calico.yam
如下图所示:
6、设置kubelet开机自启
root@k8s-master-62:~# systemctl enable kubelet
八、将worker节点加入k8s集群
说明:以下操作仅在worker节点执行。
1、将worker节点加入k8s集群
#注意:kubeamd join命令的token只有24h,24h就过期,需要执行kubeadm token create --print-join-command重新生成。
root@k8s-worker-63:~# kubeadm join 192.168.1.62:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:4dc96a7ecd538256dd5116b8c0f7a1155e52874532a1e10f3c7d02a15922d0a9
如下图所示:
2、设置kubelet开机自启
root@k8s-master-62:~# systemctl enable kubelet
九、k8s集群测试
1、查看集群节点状态
root@k8s-master-62:~# kubectl get nodes
root@k8s-master-62:~# kubectl get cs
root@k8s-master-62:~# kubectl get pods -A
root@k8s-master-62:~# kubectl get svc -A
如下图所示:
2、验证k8s DNS是否可用和是否可以正常访问网络
root@k8s-master-62:~# kubectl run busybox --image busybox:1.28 --restart=Never --rm -it busybox -- sh
If you don't see a command prompt, try pressing enter.
/ # nslookup kubernetes.default
Server: 10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local
Name: kubernetes.default
Address 1: 10.96.0.1 kubernetes.default.svc.cluster.local
/ # ping www.baidu.com
PING www.baidu.com (14.119.104.254): 56 data bytes
64 bytes from 14.119.104.254: seq=0 ttl=53 time=7.779 ms
64 bytes from 14.119.104.254: seq=1 ttl=53 time=8.404 ms
如下图所示:
总结:整理不易,如果对你有帮助,可否点赞关注一下?
更多详细内容请参考:企业级K8s集群运维实战