跳转至

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