@cdmonkey
2023-08-11T13:53:10.000000Z
字数 8546
阅读 117
Kubernetes
请参见另一篇文档。
注意:从 Kubernetes 1.24 开始不再使用 Docker 作为 Runtime,而是选择使用 Containerd。
所有节点均安装 docker-ce-20.10(因为同时将会把 Containerd 安装上。若是只想安装 containerd,则只需要安装 contianerd.io
这个包)无论怎样进行安装,均需要使用 Docker 源。
yum install -y docker-ce-20.10.* docker-ce-cli-20.10.*
无需启动 Docker 服务,只需要配置及启动 Containerd 就行。
首先配置 Containerd 所需模块(所有节点):
cat <<EOF | tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF
所有节点载入模块:
modprobe -- overlay
modprobe -- br_netfilter
所有节点配置相关内核参数:
cat <<EOF | tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
所有节点载入内核参数:
sysctl --system
所有节点配置 Containerd 配置文件(注意文件名后缀,一定是 .toml
):
mkdir -pv /etc/containerd
containerd config default | tee /etc/containerd/config.toml
所有节点把 Containerd Cgroup 改为 Systemd:
vim /etc/containerd/config.toml
找出 containerd.runtimes.runc.options
这行(通常是第 96 行),写入 SystemdCgroup = true
:
所有节点把 sandbox_image Pause 镜像改为符合自己版本之地址:
registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6
最后,所有节点启动 Containerd,并配置开机启动:
systemctl daemon-reload && systemctl enable --now containerd
所有节点配置 crictl
客户端工具连接的运行时位置:
cat > /etc/crictl.yaml <<EOF
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
EOF
至此,Containerd 部分安装配置完毕。
首先于 Master01 节点上查看最新 Kubernetes 版本是多少。
yum list kubeadm.x86_64 --showduplicates | sort -r
所有节点均安装 1.23
最新版本 kubeadm、kubelet、kubectl
yum install -y kubeadm-1.23* kubelet-1.23* kubectl-1.23*
若选择的是 Containerd 作为运行时,则需要更改 kubelet 配置:
cat > /etc/sysconfig/kubelet <<EOF
KUBELET_KUBEADM_ARGS="--container-runtime=remote --runtime-request-timeout=15m --container-runtime-endpoint=unix:///run/containerd/containerd.sock"
EOF
若是不使用 Containerd 就无需执行上述配置指令。
所有节点设置 Kubeket 开机自启动(因为还没有进行初始化,因而没有 kubelet 配置文件,此时 kubelet 还不能启动)。
systemctl daemon-reload && systemctl enable --now kubelet
肯定不能启动,会有报错,没事不影响。
[root@k8s-master01 ~]# journalctl -r -u kubelet
-- Logs begin at Fri 2021-12-24 15:09:18 CST, end at Tue 2022-02-22 11:21:47 CST. --
Feb 22 11:21:47 k8s-master01 systemd[1]: kubelet.service failed.
Feb 22 11:21:47 k8s-master01 systemd[1]: Unit kubelet.service entered failed state.
Feb 22 11:21:47 k8s-master01 systemd[1]: kubelet.service: main process exited, code=exited, status=1/FAILURE
Feb 22 11:21:47 k8s-master01 kubelet[16164]: E0222 11:21:47.350109 16164 server.go:205] "Failed to load kubelet config file" ...
初始化操作只需于 Master01 节点上执行就行。
首先创建 kubeadm-config.yaml
配置文件。
[root@k8s-master01 ~]# vim kubeadm-config.yaml
文件内容:
apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: 7t2weq.bjbawausm0jaxury
ttl: 48h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 172.16.142.51
bindPort: 6443
nodeRegistration:
criSocket: /run/containerd/containerd.sock
name: k8s-master01
taints:
- effect: NoSchedule
key: node-role.kubernetes.io/master
---
apiServer:
certSANs:
- 172.16.198.180
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controlPlaneEndpoint: 172.16.198.180:16443
controllerManager: {}
dns:
type: CoreDNS
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: v1.23.4
networking:
dnsDomain: cluster.local
podSubnet: 10.244.0.0/16
serviceSubnet: 192.168.0.0/16
scheduler: {}
更新 kubeadm 文件:
kubeadm config migrate --old-config kubeadm-config.yaml --new-config new.yaml
我们就用这个 new.yaml
进行初始化(似乎也没啥变化)。
将这个文件复制至其他 master 节点:
[root@k8s-master01 ~]# for i in k8s-master02 k8s-master03; do scp new.yaml $i:/root/; done # 只是复制过去,无需再进行更改
说明:这个 new.yaml
对于其余两个 master 节点来说,只是用于下载镜像,因而无须担心里面的地址跟本机不同,只要确保 master01 节点上的配置正确就行了。
为了初始化时更为快速,这里推荐所有 master 节点(node 节点无需下载)把镜像提前进行下载。
kubeadm config images pull --config /root/new.yaml
所有节点设置开机自启动 kubelet
systemctl enable --now kubelet # 若启动失败无需理会,初始化成功后即可启动
至此就要真正开始进行初始化操作了。需要于 Master01 节点上执行初始化,初始化后将于 /etc/kubernetes
目录下生成相关证书及配置文件,而后其他 Master 节点加入进来就行了。
kubeadm init --config /root/new.yaml --upload-certs
若初始化失败,重置后再次初始化,命令见下面(没有失败就不需要执行):
kubeadm reset -f; ipvsadm --clear; rm -rf ~/.kube
初始化成功后,将生成 Token 值,用于其他节点加入时使用,因而要记录下这个 Token 值。
注意:Master01 节点需要配置场景变量,用于访问 Kubernetes 集群:
cat <<EOF >> /root/.bashrc
export KUBECONFIG=/etc/kubernetes/admin.conf
EOF
source /root/.bashrc
还可使用初始化完成后推荐使用的操作(总之效果都一样,没啥差别):
否则将有以下这样的报错:
[root@k8s-master01 ~]# kubectl get nodes
The connection to the server localhost:8080 was refused - did you specify the right host or port?
完成后就能成功执行了:
[root@k8s-master01 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master01 NotReady control-plane,master 24m v1.23.4
采用初始化进行安装,所有系统组件均以容器形态运行于 kube-system 命名空间内,这时可查看 Pod 状态:
[root@k8s-master01 ~]# kubectl get pod -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-65c54cc984-kjhpv 0/1 Pending 0 27m
coredns-65c54cc984-vqt46 0/1 Pending 0 27m
etcd-k8s-master01 1/1 Running 0 27m
kube-apiserver-k8s-master01 1/1 Running 0 27m
kube-controller-manager-k8s-master01 1/1 Running 0 27m
kube-proxy-5t8gn 1/1 Running 0 27m
kube-scheduler-k8s-master01 1/1 Running 0 27m
注意,master 节点加入同普通 node 节点有所不同(其实就是多了一个 --control-plane
)。
kubeadm join 172.16.198.180:16443 --token 7t2weq.bjbawausm0jaxury \
--discovery-token-ca-cert-hash sha256:1079f2e07ce9eddcdb56cd89f394350d7f76956703becd49723df29c2bd72742 \
--control-plane --certificate-key 6286bc2c552b44f0df8da693f57f0daea59d1f2acacc8d9af153736f8c3b6cef
上面这个命令实际上就是 token create --print-join-command
之输出以及 --control-plane
与 --certificate-key
。
这里需要注意 Token 及证书过期问题。
最后再把 node 节点纳入进来。
kubeadm join 172.16.198.180:16443 --token 7t2weq.bjbawausm0jaxury \
--discovery-token-ca-cert-hash sha256:1079f2e07ce9eddcdb56cd89f394350d7f76956703becd49723df29c2bd72742
这时查看一下集群状态:
[root@k8s-master01 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master01 NotReady control-plane,master 23h v1.23.4
k8s-master02 NotReady control-plane,master 29m v1.23.4
k8s-master03 NotReady control-plane,master 25s v1.23.4
k8s-node01 NotReady <none> 14m v1.23.4
k8s-node02 NotReady <none> 3s v1.23.4
因为还没有安装 CNI 网络插件,因而状态还是 NotReady。
Calico 是个 CNI 插件,用于 Pod 间进行跨节点通信之必备部件。
具体操作请参见另一篇文档。
以下步骤只需要于 master01 上执行。
cd /root/k8s-ha-install && git checkout manual-installation-v1.23.x && cd calico/
修改 Pod 网段(只需要改这一个地方):
POD_SUBNET=`cat /etc/kubernetes/manifests/kube-controller-manager.yaml | grep cluster-cidr= | awk -F= '{print $NF}'`
[root@k8s-master01 calico]# echo $POD_SUBNET
172.16.0.0/12 # 就是使用这个网段
[root@k8s-master01 calico]# sed -i "s#POD_CIDR#${POD_SUBNET}#g" calico.yaml # 执行替换操作
这就改好了:
最后进行安装:
[root@k8s-master01 calico]# kubectl apply -f calico.yaml
新版 Kubernetes 系统资源采集均使用 Metrics-server,可通过 Metrics 采集节点及 Pod 内存、硬盘、CPU、网络使用率等。
首先将 Master01 节点 front-proxy-ca.crt
拷贝至所有 Node 节点:
scp /etc/kubernetes/pki/front-proxy-ca.crt k8s-node01:/etc/kubernetes/pki/front-proxy-ca.crt
scp /etc/kubernetes/pki/front-proxy-ca.crt k8s-node02:/etc/kubernetes/pki/front-proxy-ca.crt
若还有更多节点请继续拷贝,总之是所有节点。
若是 kubeadm 集群,就使用 kubeadm-metrics-server
目录。
注意:若是使用老师的 yaml 文件,有个地方需要修改(修改证书文件名,否则将部署失败,CrashLoopBackOff,而且连 kubectl logs
指令也不能用,很坑~):
- --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.pem
# 这一行需要改为:
- --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt
问题找见,是我进错目录了,但还是要关注下证书名称。
[root@k8s-master01 k8s-ha-install]# kubectl apply -f kubeadm-metrics-server/comp.yaml
查看状态:
[root@k8s-master01 ~]# kubectl get po -n kube-system -l k8s-app=metrics-server
NAME READY STATUS RESTARTS AGE
metrics-server-5cf8885b66-db7jc 1/1 Running 0 5m45s
查看 node 资源使用情况:
[root@k8s-master01 ~]# kubectl top node
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
k8s-master01 384m 19% 1682Mi 43%
k8s-master02 293m 14% 1154Mi 30%
k8s-master03 286m 14% 1063Mi 27%
k8s-node01 120m 6% 674Mi 17%
k8s-node02 117m 5% 712Mi 18%
[root@k8s-master01 ~]# kubectl top po -A
NAMESPACE NAME CPU(cores) MEMORY(bytes)
kube-system calico-kube-controllers-6c48db6484-cz6tl 5m 19Mi
kube-system calico-node-85czs 42m 127Mi
kube-system calico-node-9mrd6 54m 126Mi
kube-system calico-node-gn7sb 72m 111Mi
...
Dashboard 用于展示集群中各类资源,同时也可通过它实时查看 Pod 日志,还能于容器中执行一些命令等。
[root@k8s-master01 k8s-ha-install]# cd dashboard/
[root@k8s-master01 dashboard]# kubectl create -f .
查看端口号:
[root@k8s-master01 dashboard]# kubectl get svc -n kubernetes-dashboard
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
dashboard-metrics-scraper ClusterIP 192.168.123.148 <none> 8000/TCP 110s
kubernetes-dashboard NodePort 192.168.25.167 <none> 443:30696/TCP 110s
使用这个端口号,通过任意安装了 kube-proxy 之宿主机 IP+端口就能够访问 Dashboard。
然后选择登录途径为令牌(token)。
查看 Token:
kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')
把最后面那一长串 token 值输入至令牌后,单击登录就能够访问了。
把 Kube-proxy 变更为 ipvs,因为于初始化集群时注释了 ipvs 配置,因而需要自行修改。
于 Master01 节点执行:
kubectl edit cm kube-proxy -n kube-system
# 进行修改:
mode: ipvs
更新 Pod:
kubectl patch daemonset kube-proxy \
-p "{\"spec\":{\"template\":{\"metadata\":{\"annotations\":{\"date\":\"`date +'%s'`\"}}}}}" -n kube-system
# 执行完这个指令后,kube-proxy pod 将全部重启
进行验证:
[root@k8s-master01 ~]# curl 127.0.0.1:10249/proxyMode
ipvs
参考内容:
https://blog.frognew.com/2021/12/kubeadm-install-kubernetes-1.23.html