环境要求
纯净 CentOS 7.x 及以上
机器配置 2 核 4G 以上 3台及以上
服务器网络互通
禁止 Swap 分区
软件安装
关闭防火墙
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 修改
cat > /etc/hosts << EOF
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.103 master
192.168.1.104 node1
192.168.1.105 node2
EOF
时间同步
yum install -y ntpdate & ntpdate ntp.aliyun.com
echo '/5 * /usr/sbin/ntpdate -u ntp.aliyun.com' >>/var/spool/cron/root
systemctl restart crond
crontab -l
安装 Docker
1)配置 Docker 的 yum 仓库(阿里云仓库)
yum -y install yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
2)查找并安装指定版本 Docker(确定 K8S 支持的 Docker 版本)
yum list docker-ce.x86_64 --showduplicates | sort -r
yum -y install docker-ce-19.03.11 docker-ce-cli-19.03.11 containerd.io-1.2.13
systemctl enable docker & systemctl start docker
3)修改 Docker 的 Cgroup Driver 为 systemd(确保服务器节点在资源紧张的情况更加稳定)
mkdir /etc/docker
touch /etc/docker/daemon.json
cat > /etc/docker/daemon.json << EOF
{
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
systemctl daemon-reload & systemctl restart docker
docker info | grep Cgroup
安装 kubeadm
1)配置 kubenetes 的 yum 仓库
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
2)安装 kubelat、kubectl、kubeadm
yum install -y kubelet kubeadm kubectl
systemctl enable kubelet
初始化 Master
1)配置忽略 Swap 报错
vi /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--fail-swap-on=false"
2)初始化 Master
仅在 Master 节点执行
kubeadm init \
--apiserver-advertise-address=192.168.1.103 \
--kubernetes-version v1.20.1 \
--image-repository registry.aliyuncs.com/google_containers \
--service-cidr=10.10.0.0/16 \
--pod-network-cidr=10.244.0.0/16 \
--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 报错信息
然后等待拉取镜像,初始化完成以后按提示运行
记住 kubeadm jion 192.168.1.103:6443 … 命令,以便后续加入 Node 节点
配置 kubeconfig
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
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
检查所需镜像拉取是否成功
执行 kubectl get nodes
发现现有节点为 NotReady 状态,说明我们需要配置 Node 节点了
kubectl get nodes
kubectl get pods -n kube-system
4)添加 Flannel 网络组件
Flannel 是一个专门为 K8s 定制的网络解决方案,主要解决 Pod 跨主机通信问题
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# 由于国内网络问题,可能需要科学上网进行手动下载
kubectl apply -f kube-flannel.yml
# 验证 flannel 网络插件是否部署成功(Running 即为成功)
kubectl get pods -n kube-system | grep flannel
报错: CoreDNS 一直处于创建(ContainerCreating)状态
kubectl describe pod coredns-7f89b7bc75-h225g -n kube-system
kubectl describe pod coredns-7f89b7bc75-rb89w -n kube-system
kubectl logs coredns-7f89b7bc75-h225g -n kube-system
kubectl logs coredns-7f89b7bc75-rb89w -n kube-system
cni0 网桥配置了一个不同网段的 IP 地址所导致的,做法是删除 cni0,让网络插件重新自动创建。
由于 cni0 是作为 Docker 的网桥,因此需要暂停 Docker 和 K8s。
kubeadm reset
rm -f /etc/cni/net.d/*
rm -rf $HOME/.kube/config
systemctl stop kubelet & systemctl stop docker
rm -rf /var/lib/cni/
rm -rf /var/lib/kubelet/
rm -rf /etc/cni/
ifconfig cni0 down
ifconfig flannel.1 down
ifconfig docker0 down
ip link delete cni0
ip link delete flannel.1
然后重新初始化,添加 Flannel 组件
systemctl start kubelet & systemctl start docker
kubeadm init \
--apiserver-advertise-address=192.168.1.103 \
--kubernetes-version v1.20.1 \
--image-repository registry.aliyuncs.com/google_containers \
--service-cidr=10.10.0.0/16 \
--pod-network-cidr=10.244.0.0/16 \
--ignore-preflight-errors=Swap
kubectl apply -f kube-flannel.yml
加入 Node 节点
所有 Node 节点运行
1)配置忽略 Swap 报错
cat > /etc/sysconfig/kubelet << EOF
KUBELET_EXTRA_ARGS="--fail-swap-on=false"
EOF
2)加入 Node 节点
kubeadm join 192.168.1.103:6443 --token 7wor0d.7i31zm9hw330ay97 \
--discovery-token-ca-cert-hash sha256:70970addce82343177ba403997644a2a38d7b8058724c5c22b8b1d5018c05560
1)Master 节点运行 kubectl get nodes
检查节点状态,返回如下结果则集群状态正常
2)查看集群客户端和服务端程序版本信息
3)查看集群信息
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