环境要求

纯净 CentOS 7.x 及以上
机器配置 2 核 4G 以上 3台及以上
服务器网络互通
禁止 Swap 分区

软件安装

yum install -y wget net-tools

关闭防火墙

systemctl stop firewalld & systemctl disable firewalld

关闭 SELinux

vi /etc/selinux/config 文件中设置 SELINUX=disabled ,重启服务器
setenforce 0 & ``sed -i 's/enforcing/disabled/' /etc/selinux/config

关闭 Swap

如果服务器配置低,可以不关闭 swap,后续忽略相应报错即可
swapoff -a & sed -i 's/.``_swap._``/#&/' /etc/fstab

Host 修改

  1. cat > /etc/hosts << EOF
  2. 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
  3. ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
  4. 192.168.1.103 master
  5. 192.168.1.104 node1
  6. 192.168.1.105 node2
  7. EOF

时间同步

yum install -y ntpdate & ntpdate ntp.aliyun.com

  1. echo '/5 * /usr/sbin/ntpdate -u ntp.aliyun.com' >>/var/spool/cron/root
  2. systemctl restart crond
  3. crontab -l

安装 Docker

1)配置 Docker 的 yum 仓库(阿里云仓库)

  1. yum -y install yum-utils device-mapper-persistent-data lvm2
  2. yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  3. yum makecache fast

2)查找并安装指定版本 Docker(确定 K8S 支持的 Docker 版本)

  1. yum list docker-ce.x86_64 --showduplicates | sort -r
  2. yum -y install docker-ce-19.03.11 docker-ce-cli-19.03.11 containerd.io-1.2.13
  3. systemctl enable docker & systemctl start docker

3)修改 Docker 的 Cgroup Driver 为 systemd(确保服务器节点在资源紧张的情况更加稳定)

  1. mkdir /etc/docker
  2. touch /etc/docker/daemon.json
  3. cat > /etc/docker/daemon.json << EOF
  4. {
  5. "exec-opts": ["native.cgroupdriver=systemd"]
  6. }
  7. EOF
  8. systemctl daemon-reload & systemctl restart docker
  9. docker info | grep Cgroup

安装 kubeadm

1)配置 kubenetes 的 yum 仓库

  1. cat > /etc/yum.repos.d/kubernetes.repo << EOF
  2. [kubernetes]
  3. name=Kubernetes
  4. baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
  5. enabled=1
  6. gpgcheck=1
  7. repo_gpgcheck=1
  8. gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
  9. EOF

2)安装 kubelat、kubectl、kubeadm

  1. yum install -y kubelet kubeadm kubectl
  2. systemctl enable kubelet

集群还未建立,只能先加开机启动

初始化 Master

1)配置忽略 Swap 报错

  1. vi /etc/sysconfig/kubelet
  2. KUBELET_EXTRA_ARGS="--fail-swap-on=false"

2)初始化 Master
仅在 Master 节点执行

  1. kubeadm init \
  2. --apiserver-advertise-address=192.168.1.103 \
  3. --kubernetes-version v1.20.1 \
  4. --image-repository registry.aliyuncs.com/google_containers \
  5. --service-cidr=10.10.0.0/16 \
  6. --pod-network-cidr=10.244.0.0/16 \
  7. --ignore-preflight-errors=Swap

参数说明:

  • —kubernetes-version # 指定 Kubernetes 版本
  • —image-repository # 指定阿里云镜像仓库地址
  • —pod-network-cidr # 指定 pod 网络段,默认使用 10.244.0.0/16 不要修改,容易造成 F**lannel 状态 CrashLoopBackOff**
  • —service-cidr # 指定 service 网络段
  • —ignore-preflight-errors=Swap # 忽略 Swap 报错信息

然后等待拉取镜像,初始化完成以后按提示运行
image.png
记住 kubeadm jion 192.168.1.103:6443 … 命令,以便后续加入 Node 节点

配置 kubeconfig

  1. mkdir -p $HOME/.kube
  2. cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  3. chown $(id -u):$(id -g) $HOME/.kube/config

报错:[ERROR NumCPU]: the number of available CPUs 1 is less than the required 2
解决:出现该报错,是 CPU 有限制,将 CPU 修改为 2 核即可(最好内存为 4G 以上)
初始化完成使用 docker image ls 检查所需镜像拉取是否成功
image.png
执行 kubectl get nodes 发现现有节点为 NotReady 状态,说明我们需要配置 Node 节点了

  1. kubectl get nodes
  2. kubectl get pods -n kube-system

4)添加 Flannel 网络组件
Flannel 是一个专门为 K8s 定制的网络解决方案,主要解决 Pod 跨主机通信问题

  1. wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
  2. # 由于国内网络问题,可能需要科学上网进行手动下载
  3. kubectl apply -f kube-flannel.yml

image.png

  1. # 验证 flannel 网络插件是否部署成功(Running 即为成功)
  2. kubectl get pods -n kube-system | grep flannel

报错: CoreDNS 一直处于创建(ContainerCreating)状态
image.png

  1. kubectl describe pod coredns-7f89b7bc75-h225g -n kube-system
  2. kubectl describe pod coredns-7f89b7bc75-rb89w -n kube-system
  3. kubectl logs coredns-7f89b7bc75-h225g -n kube-system
  4. kubectl logs coredns-7f89b7bc75-rb89w -n kube-system

cni0 网桥配置了一个不同网段的 IP 地址所导致的,做法是删除 cni0,让网络插件重新自动创建。
由于 cni0 是作为 Docker 的网桥,因此需要暂停 Docker 和 K8s。

  1. kubeadm reset
  2. rm -f /etc/cni/net.d/*
  3. rm -rf $HOME/.kube/config
  4. systemctl stop kubelet & systemctl stop docker
  5. rm -rf /var/lib/cni/
  6. rm -rf /var/lib/kubelet/
  7. rm -rf /etc/cni/
  8. ifconfig cni0 down
  9. ifconfig flannel.1 down
  10. ifconfig docker0 down
  11. ip link delete cni0
  12. ip link delete flannel.1

然后重新初始化,添加 Flannel 组件

  1. systemctl start kubelet & systemctl start docker
  2. kubeadm init \
  3. --apiserver-advertise-address=192.168.1.103 \
  4. --kubernetes-version v1.20.1 \
  5. --image-repository registry.aliyuncs.com/google_containers \
  6. --service-cidr=10.10.0.0/16 \
  7. --pod-network-cidr=10.244.0.0/16 \
  8. --ignore-preflight-errors=Swap
  9. kubectl apply -f kube-flannel.yml

image.png
加入 Node 节点
所有 Node 节点运行
1)配置忽略 Swap 报错

  1. cat > /etc/sysconfig/kubelet << EOF
  2. KUBELET_EXTRA_ARGS="--fail-swap-on=false"
  3. EOF

2)加入 Node 节点

  1. kubeadm join 192.168.1.103:6443 --token 7wor0d.7i31zm9hw330ay97 \
  2. --discovery-token-ca-cert-hash sha256:70970addce82343177ba403997644a2a38d7b8058724c5c22b8b1d5018c05560

image.png
image.png
1)Master 节点运行 kubectl get nodes 检查节点状态,返回如下结果则集群状态正常
image.png
2)查看集群客户端和服务端程序版本信息
image.png
3)查看集群信息
image.png

Master 节点创建 TLS 证书和秘钥

安装 CFSSL
wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
chmod +x cfssl_linux-amd64
mv cfssl_linux-amd64 /usr/local/bin/cfssl

wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
chmod +x cfssljson_linux-amd64
mv cfssljson_linux-amd64 /usr/local/bin/cfssljson

wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
chmod +x cfssl-certinfo_linux-amd64
mv cfssl-certinfo_linux-amd64 /usr/local/bin/cfssl-certinfo

export PATH=/usr/local/bin:$PATH

创建 CA 配置文件

mkdir /root/ssl
cd /root/ssl
cfssl print-defaults config > config.json
cfssl print-defaults csr > csr.json

根据 config.json 文件的格式创建如下的 ca-config.json 文件

过期时间设置成了 87600h

cat > ca-config.json <{
“signing”: {
“default”: {
“expiry”: “87600h”
},
“profiles”: {
“kubernetes”: {
“usages”: [
“signing”,
“key encipherment”,
“server auth”,
“client auth”
],
“expiry”: “87600h”
}
}
}
}
EOF

ca-config.json:可以定义多个 profiles,分别指定不同的过期时间、使用场景等参数;后续在签名证书时使用某个 profile;
signing:表示该证书可用于签名其它证书;生成的 ca.pem 证书中 CA=TRUE;
server auth:表示 client 可以用该 CA 对 server 提供的证书进行验证;
client auth:表示 server 可以用该 CA 对 client 提供的证书进行验证;

生成 CA 证书和私钥

cfssl gencert -initca csr.json | cfssljson -bare ca
ls ca*

创建 kubernetes 证书

创建 kubernetes 证书签名请求文件 kubernetes-csr.json:
cat > kubernetes-csr.json <{
“CN”: “kubernetes”,
“hosts”: [
“127.0.0.1”,
“192.168.1.103”,
“192.168.1.104”,
“192.168.1.105”,
“10.254.0.1”,
“kubernetes”,
“kubernetes.default”,
“kubernetes.default.svc”,
“kubernetes.default.svc.cluster”,
“kubernetes.default.svc.cluster.local”
],
“key”: {
“algo”: “rsa”,
“size”: 2048
},
“names”: [
{
“C”: “CN”,
“ST”: “Shenzhen”,
“L”: “Shenzhen”,
“O”: “k8s”,
“OU”: “System”
}
]
}
EOF

生成 kubernetes 证书和私钥

cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kubernetes-csr.json | cfssljson -bare kubernetes
ls kubernetes*

创建 admin 证书

创建 admin 证书签名请求文件 admin-csr.json:
cat > admin-csr.json <{
“CN”: “admin”,
“hosts”: [],
“key”: {
“algo”: “rsa”,
“size”: 2048
},
“names”: [
{
“C”: “CN”,
“ST”: “Shenzhen”,
“L”: “Shenzhen”,
“O”: “system:masters”,
“OU”: “System”
}
]
}
EOF

生成 admin 证书和私钥:
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes admin-csr.json | cfssljson -bare admin
ls admin*

创建 kube-proxy 证书

创建 kube-proxy 证书签名请求文件 kube-proxy-csr.json:
cat > kube-proxy-csr.json <{
“CN”: “system:kube-proxy”,
“hosts”: [],
“key”: {
“algo”: “rsa”,
“size”: 2048
},
“names”: [
{
“C”: “CN”,
“ST”: “Shenzhen”,
“L”: “Shenzhen”,
“O”: “k8s”,
“OU”: “System”
}
]
}
EOF

生成 kube-proxy 客户端证书和私钥
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-proxy-csr.json | cfssljson -bare kube-proxy
ls kube-proxy*

校验证书

cfssl-certinfo -cert kubernetes.pem

分发证书

将生成的证书和秘钥文件(后缀名为.pem)拷贝到所有机器的 /etc/kubernetes/ssl 目录下备用;
mkdir -p /etc/kubernetes/ssl
cp .pem /etc/kubernetes/ssl
scp /etc/kubernetes/ssl/
.pem root@192.168.1.104:/etc/kubernetes/ssl
scp /etc/kubernetes/ssl/*.pem root@192.168.1.105:/etc/kubernetes/ssl

https://jimmysong.io/kubernetes-handbook/practice/create-kubeconfig.html

下载 kubectl

注意请下载对应的 Kubernetes 版本的安装包

源码安装

wget https://dl.k8s.io/v1.18.0/kubernetes-client-linux-amd64.tar.gz
tar -xzvf kubernetes-client-linux-amd64.tar.gz
cp kubernetes/client/bin/kube /usr/bin/
chmod a+x /usr/bin/kube

使用原生包管理器安装

cat < /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF
yum install -y kubectl

查看安装的版本
kubectl version —client