k8s 安装¶
1 环境准备¶
1.1 检查操作系统的版本¶
# 此方式下安装kubernetes集群要求Centos版本要在7.5或之上
[root@k8s ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
1.2 升级系统内核¶
centos7 默认内核版本是 3.10,此版本内核存在漏洞,k8s 中建议使用 4 以上内核版本
# 1.查看当前内核版本
[root@k8s ~]# uname -r
3.10.0-1160.el7.x86_64
# 2.添加yum源仓库
[root@k8s ~]# mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
[root@k8s ~]# curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
[root@k8s ~]# curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
[root@k8s ~]# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
[root@k8s ~]# yum install -y https://www.elrepo.org/elrepo-release-7.0-4.el7.elrepo.noarch.rpm
# 3.更新yum源仓库(这步更新较多,速度比较慢)
[root@k8s ~]# yum -y update
# 4.下载内核
# 4.1查看可用的系统内核包
[root@k8s ~]# yum --disablerepo="*" --enablerepo="elrepo-kernel" list available
# 4.2安装内核,注意先要查看可用内核,我安装的是5.18.10版本的内核
[root@k8s ~]# yum --enablerepo=elrepo-kernel install kernel-ml -y
# 4.3查看目前可用内核
[root@k8s ~]# awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg
0 : CentOS Linux (5.18.10-1.el7.elrepo.x86_64) 7 (Core)
1 : CentOS Linux (3.10.0-1160.el7.x86_64) 7 (Core)
2 : CentOS Linux (0-rescue-338bf7be5ccb4bd4a9cd9e4ea1e91ad9) 7 (Core)
# 5.使用序号为0的内核,序号0是前面查出来的可用内核编号
[root@k8s ~]# grub2-set-default 0
# 6.生成 grub 配置文件并重启
[root@k8s ~]# grub2-mkconfig -o /boot/grub2/grub.cfg
# 7.重启机器
[root@k8s ~]# reboot
# 8.查看内核
[root@k8s ~]# uname -r
5.18.9-1.el7.elrepo.x86_64
2 主机名解析¶
为了方便集群节点间的直接调用,在这个配置一下主机名解析,企业中推荐使用内部 DNS 服务器
# 2. 主机名成解析 编辑三台服务器的/etc/hosts文件,添加下面内容
192.168.211.20 master
192.168.211.21 node1
192.168.211.22 node2
3 chronyd 时间同步¶
kubernetes 要求集群中的节点时间必须精确一直,这里使用 chronyd 服务从网络同步时间。
企业中建议配置内部的会见同步服务器:
# 安装chrony
[root@k8s ~]# yum install -y chrony
# 启动chronyd服务
[root@k8s ~]# systemctl enable chronyd
[root@k8s ~]# systemctl start chronyd
[root@k8s ~]# systemctl status chronyd
4 禁用 firewalld 服务¶
# 1 关闭firewalld服务
[root@k8s ~]# systemctl disable firewalld
[root@k8s ~]# systemctl stop firewalld
[root@k8s ~]# sed -i 's/enforcing/disabled/' /etc/selinux/config
[root@k8s ~]# setenforce 0
[root@k8s ~]# systemctl status firewalld
5 禁用 selinux¶
selinux 是 linux 系统下的一个安全服务,如果不关闭它,在安装集群中会产生各种各样的奇葩问题
# 编辑 /etc/selinux/config 文件,修改SELINUX的值为disable
# 注意修改完毕之后需要重启linux服务
SELINUX=disabled
[root@k8s ~]# sed -i 's/enforcing/disabled/' /etc/selinux/config
[root@k8s ~]# setenforce 0
6 禁用 swap 分区¶
swap 分区指的是虚拟内存分区,它的作用是物理内存使用完,之后将磁盘空间虚拟成内存来使用,启用 swap 设备会对系统的性能产生非常负面的影响,因此 kubernetes 要求每个节点都要禁用 swap 设备,但是如果因为某些原因确实不能关闭 swap 分区,就需要在集群安装过程中通过明确的参数进行配置说明
# 编辑分区配置文件/etc/fstab,注释掉swap分区一行
# 注意修改完毕之后需要重启linux服务
# 注释掉 /dev/mapper/centos-swap swap
[root@k8s ~]# swapoff -a
[root@k8s ~]# sed -ri 's/.*swap.*/#&/' /etc/fstab
7 修改 linux 的内核参数¶
# 修改linux的内核采纳数,添加网桥过滤和地址转发功能
# 编辑/etc/sysctl.d/kubernetes.conf文件,添加如下配置:
[root@k8s ~]# cat > /etc/sysctl.d/k8s_better.conf << EOF
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
vm.swappiness=0
vm.overcommit_memory=1
vm.panic_on_oom=0
fs.inotify.max_user_instances=8192
fs.inotify.max_user_watches=1048576
fs.file-max=52706963
fs.nr_open=52706963
net.ipv6.conf.all.disable_ipv6=1
net.netfilter.nf_conntrack_max=2310720
EOF
# 重新加载配置
[root@k8s ~]# modprobe br_netfilter
[root@k8s ~]# lsmod |grep conntrac
[root@k8s ~]# modprobe ip_conntrack
[root@k8s ~]# sysctl -p /etc/sysctl.d/k8s_better.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
vm.overcommit_memory = 1
vm.panic_on_oom = 0
fs.inotify.max_user_instances = 8192
fs.inotify.max_user_watches = 1048576
fs.file-max = 52706963
fs.nr_open = 52706963
net.ipv6.conf.all.disable_ipv6 = 1
net.netfilter.nf_conntrack_max = 2310720
8 配置 ipvs 功能¶
在 Kubernetes 中 Service 有两种带来模型,一种是基于 iptables 的,一种是基于 ipvs 的两者比较的话,ipvs 的性能明显要高一些,但是如果要使用它,需要手动载入 ipvs 模块
# 1.相关工具安装
[root@k8s ~]# yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget vim net-tools git
# 2.开启ipvs 转发
[root@k8s ~]# modprobe br_netfilter
# 3.添加需要加载的模块写入脚本文件
[root@k8s ~]# vi /etc/sysconfig/modules/ipvs.modules
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
# 4.为脚本添加执行权限
[root@k8s ~]# chmod 755 /etc/sysconfig/modules/ipvs.modules
# 5.执行脚本文件
[root@k8s ~]# /bin/bash /etc/sysconfig/modules/ipvs.modules
# 5.查看对应的模块是否加载成功
[root@k8s ~]# lsmod | grep -e ip_vs -e nf_conntrack
ip_vs_sh 16384 0
ip_vs_wrr 16384 0
ip_vs_rr 16384 0
ip_vs 159744 6 ip_vs_rr,ip_vs_sh,ip_vs_wrr
nf_conntrack 151552 1 ip_vs
nf_defrag_ipv6 24576 2 nf_conntrack,ip_vs
nf_defrag_ipv4 16384 1 nf_conntrack
libcrc32c 16384 3 nf_conntrack,xfs,ip_vs
```
## 安装containerd
```shell
# 创建 /etc/modules-load.d/containerd.conf 配置文件:
[root@k8s ~]# cat << EOF > /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF
[root@k8s ~]# modprobe overlay
[root@k8s ~]# modprobe br_netfilterr
# 可能不需要,安装dockers时候已经装了
[root@k8s ~]# yum install -y containerd.io
# 生成containerd的配置文件
[root@k8s ~]# mkdir /etc/containerd -p
# 生成配置文件
[root@k8s ~]# containerd config default > /etc/containerd/config.toml
# 编辑配置文件
[root@k8s ~]# vi /etc/containerd/config.toml
SystemdCgroup = false 改为 SystemdCgroup = true
# sandbox_image = "k8s.gcr.io/pause:3.6"
改为:
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.6"
[root@k8s ~]# systemctl enable containerd
Created symlink from /etc/systemd/system/multi-user.target.wants/containerd.service to /usr/lib/systemd/system/containerd.service.
[root@k8s ~]# systemctl start containerd
[root@k8s ~]# systemctl status containerd
[root@k8s ~]# ctr version
Client:
Version: 1.6.6
Revision: 10c12954828e7c7c9b6e0ea9b0c02b01407d3ae1
Go version: go1.17.11
Server:
Version: 1.6.6
Revision: 10c12954828e7c7c9b6e0ea9b0c02b01407d3ae1
UUID: 445e2c8d-c369-44ee-b43b-94398f778f6f
[root@k8s ~]# runc -version
runc version 1.1.2
commit: v1.1.2-0-ga916309
spec: 1.0.2-dev
go: go1.17.11
libseccomp: 2.3.1
9 安装 cri-dockerd¶
项目地址: https://github.com/Mirantis/cri-dockerd
# 下载
[root@master ~]# wget -O cri-dockerd-0.2.3.amd64.tgz https://github.com/Mirantis/cri-dockerd/releases/download/v0.2.3/cri-dockerd-0.2.3.amd64.tgz
[root@master ~]# tar -xf cri-dockerd-0.2.3.amd64.tgz
[root@master ~]# cp cri-dockerd/cri-dockerd /usr/bin/
[root@master ~]# chmod +x /usr/bin/cri-dockerd
# 配置启动文件
[root@master ~]# cat <<"EOF" > /usr/lib/systemd/system/cri-docker.service
[Unit]
Description=CRI Interface for Docker Application Container Engine
Documentation=https://docs.mirantis.com
After=network-online.target firewalld.service docker.service
Wants=network-online.target
Requires=cri-docker.socket
[Service]
Type=notify
ExecStart=/usr/bin/cri-dockerd --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.7
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
StartLimitBurst=3
StartLimitInterval=60s
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
Delegate=yes
KillMode=process
[Install]
WantedBy=multi-user.target
EOF
# 生成socket 文件
[root@master ~]# cat <<"EOF" > /usr/lib/systemd/system/cri-docker.socket
[Unit]
Description=CRI Docker Socket for the API
PartOf=cri-docker.service
[Socket]
ListenStream=%t/cri-dockerd.sock
SocketMode=0660
SocketUser=root
SocketGroup=docker
[Install]
WantedBy=sockets.target
EOF
[root@master ~]# systemctl daemon-reload
[root@master ~]# systemctl start cri-docker
[root@master ~]# systemctl enable cri-docker
[root@master ~]# systemctl status cri-docker
10 安装 docker¶
详见 [[Docker部署配置]]
# 2. 安装完docker后
# 3. 1.Docker 在默认情况下使用Vgroup Driver为cgroupfs,而Kubernetes推荐使用systemd来替代cgroupfs
[root@k8s ~]# vi /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"]
}
# 4. 2.启动dokcer
[root@k8s ~]# systemctl restart docker
[root@k8s ~]# systemctl enable docker
[root@k8s ~]# systemctl status docker
11 安装 Kubernetes 组件¶
# 1、由于kubernetes的镜像在国外,速度比较慢,这里切换成国内的镜像源
# 2、编辑/etc/yum.repos.d/kubernetes.repo,添加下面的配置
[root@k8s ~]# vi /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgchech=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
[root@k8s ~]# yum clean all
[root@k8s ~]# yum makecache fast
# 3、安装kubeadm、kubelet和kubectl
[root@k8s ~]# yum install -y kubectl kubelet kubeadm
# 4、配置kubelet的cgroup
[root@k8s ~]# vi /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
# 5、设置kubelet为开机自启动即可,由于没有生成配置文件,集群初始化后自动启动
[root@k8s ~]# systemctl enable kubelet
11.1 准备集群镜像¶
# 在安装kubernetes集群之前,必须要提前准备好集群需要的镜像,所需镜像可以通过下面命令查看
[root@k8s ~]# kubeadm config images list --kubernetes-version=v1.24.2
k8s.gcr.io/kube-apiserver:v1.24.2
k8s.gcr.io/kube-controller-manager:v1.24.2
k8s.gcr.io/kube-scheduler:v1.24.2
k8s.gcr.io/kube-proxy:v1.24.2
k8s.gcr.io/pause:3.7
k8s.gcr.io/etcd:3.5.3-0
k8s.gcr.io/coredns/coredns:v1.8.6
# 下载镜像
# 此镜像kubernetes的仓库中,由于网络原因,无法连接,下面提供了一种替换方案
[root@k8s ~]# vi k8s_images_install.sh
images=(
kube-apiserver:v1.24.2
kube-controller-manager:v1.24.2
kube-scheduler:v1.24.2
kube-proxy:v1.24.2
pause:3.7
etcd:3.5.3-0
coredns:v1.8.6
)
for imageName in ${images[@]};do
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
done
[root@k8s ~]# chmod 775 k8s_images_install.sh
[root@k8s ~]# sh k8s_images_install.sh
11.2 kubectl 命令补齐¶
[root@master ~]# yum install bash-completion -y
[root@master ~]# source /usr/share/bash-completion/bash_completion
[root@master ~]# source <(kubectl completion bash)
[root@master ~]# kubectl completion bash >/etc/bash_completion.d/kubectl
11.3 集群初始化¶
下面的操作只需要在 master 节点上执行即可
# 创建集群
# --apiserver-advertise-address 集群通告地址
# --image-repository 由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址
# --kubernetes-version K8s版本,与上面安装的一致
# --service-cidr 集群内部虚拟网络,Pod统一访问入口
# --pod-network-cidr Pod网络,,与下面部署的CNI网络组件yaml中保持一致
# --cri-socket 选择cri-dockerd插件需要此参数
[root@k8s ~]# kubeadm init \
--apiserver-advertise-address=192.168.211.20 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version=v1.24.2 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--cri-socket /var/run/cri-dockerd.sock
# 创建必要文件
[root@master ~]# mkdir -p $HOME/.kube
[root@master ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@master ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
# root user 执行
[root@master ~]# export KUBECONFIG=/etc/kubernetes/admin.conf
[root@master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master NotReady control-plane 2m6s v1.24.2
下面的操作只需要在 node 节点上执行即可
[root@master ~]# kubeadm join 192.168.211.20:6443 --token wm1bwp.bujdnu55z9a9dqtr \
--discovery-token-ca-cert-hash sha256:1cfd2e95109ab1f919a51bded7520a4718687f1270026f69035426bde0716f5f --cri-socket /var/run/cri-dockerd.sock
在master上查看节点信息
[root@master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master NotReady master 6m v1.17.4
node1 NotReady <none> 22s v1.17.4
node2 NotReady <none> 19s v1.17.4
11.4 安装网络插件,只在 master 节点操作即可¶
网络组件有很多种,只需要部署其中一个即可,推荐 Calico。 Calico 是一个纯三层的数据中心网络方案,Calico 支持广泛的平台,包括 Kubernetes、OpenStack 等。 Calico 在每一个计算节点利用 Linux Kernel 实现了一个高效的虚拟路由器( vRouter) 来负责数据转发,而每个 vRouter 通过 BGP 协议负责把自己上运行的 workload 的路由信息向整个 Calico 网络内传播。 此外,Calico 项目还实现了 Kubernetes 网络策略,提供 ACL 功能。
# 1.下载Calico
root@master ~]# wget https://docs.projectcalico.org/manifests/calico.yaml --no-check-certificate
# 2.编辑配置文件
root@master ~]# vi +4434 calico.yaml
- name: CALICO_IPV4POOL_CIDR
value: "10.244.0.0/16"
# 3.应用插件
[root@master ~]# kubectl apply -f calico.yaml
# 4.去掉主节点上面不可调度pod污点
[root@master ~]# kubectl describe node master
[root@master ~]# kubectl taint nodes --all node-role.kubernetes.io/control-plane:NoSchedule-
node/master untainted
11.5 kubelet 和 docker 启停¶
- systemctl restart kubelet
- systemctl restart docker
- systemctl restart cri-docker