国内部署k8s集群.

国内云服务,快速部署k8s,笔记(debian为例)

Step1 安装 Containerd

https://github.com/containerd/containerd/blob/main/docs/getting-started.md

k8s 从1.24起不再支持docker,因此这里我选择使用 containerd。选择 containerd作为运行时的组件,它调用链更短,组件更少,更稳定,占用节点资源更少

先决条件

根据文档,按照需求配置内核模块,配置完成最好重启
https://kubernetes.io/zh-cn/docs/setup/production-environment/container-runtimes/#install-and-configure-prerequisites

安装 containerd

下载二进制文件 containerd-<VERSION>-<OS>-<ARCH>.tar.gz地址 解压到 /usr/local:

1
tar Cxzvf /usr/local containerd-1.6.8-linux-amd64.tar.gz

注意: 不要下网上其他教程所说的包名中含有「cri」的二进制包,如cri-containerd-....cri-containerd-...,那已经过时了,最新的版本中cri已经集成进 containerd-<VERSION>-<OS>-<ARCH>.tar.gz

然后配置systmed自启动:

1
2
3
4
5
wget /usr/local/lib/systemd/system/containerd.service
mkdir -p /usr/local/lib/systemd/system
mv containerd.service /usr/local/lib/systemd/system/containerd.service
systemctl daemon-reload
systemctl enable --now containerd

安装 runc

runc用来创建和运行容器,containerd作为常驻进程用来管理容器

Download the runc. binary from https://github.com/opencontainers/runc/releases , verify its sha256sum, and install it as /usr/local/sbin/runc

1
install -m 755 runc.amd64 /usr/local/sbin/runc

安装 cni 插件

用来管理容器网络

Download the cni-plugins---.tgz archive from https://github.com/containernetworking/plugins/releases , verify its sha256sum, and extract it under /opt/cni/bin:

1
2
mkdir -p /opt/cni/bin
tar Cxzvf /opt/cni/bin cni-plugins-linux-amd64-v1.1.1.tgz

配置 containerd 镜像

官网教程并没有这个步骤,但是值得注意的是,不手动配置containerd镜像源,大概率会导致containerd无法拉取pause镜像(我不是很理解,使用kubeadm可以指定镜像源并拉取pause,但是此操作并没有影响containerd再拉取一个pause镜像)

使用此命令生成默认配置文件

1
containerd config default > /etc/containerd/config.toml

然后讲配置文件中的sand_box,从k8s.gcr.io/pause:$version改为registry.aliyuncs.com/google_containers/pause:$version

当然也可以直接修改配置文件中的镜像源,但是我没有成功,报错404,配置如下:

1
2
3
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."k8s.gcr.io"]
endpoint = ["registry.aliyuncs.com/google_containers"]

打开必要端口

20221017140208

安装 kubeadm kubelet kubectl

官网教程要求从google源安装,但是国内是无法访问的,我们可以使用国内阿里云镜像源来安装

添加 ali镜像源 并安装工具组

https://developer.aliyun.com/mirror/kubernetes/

锁定版本

1
apt-mark hold kubelet kubeadm kubectl

kubelet 现在每隔几秒就会重启,因为它陷入了一个等待 kubeadm 指令的死循环。

使用 kubeadm 安装集群

新建一个文件夹,免得东西搞乱掉

1
mkdir k8s_setup && cd k8s_setup

kubeadm 命令允许使用命令行指定各个参数,但是参数太多了,不如直接写成一个配置文件

1
vim init-config.yaml

这是我的,当然可以使用 kubeadm config print init-defaults 自己写一份,具体字段可以去 github 仓库里类型定义里找

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#init-config.yaml

apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
ttl: 72h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: xx.xx.xx.xx #外网ip
bindPort: 6443
nodeRegistration:
criSocket: unix:///var/run/containerd/containerd.sock
imagePullPolicy: IfNotPresent
name: master-shanghai
taints: null
---
apiServer:
timeoutForControlPlane: 4m0s
certSANs:
- master-zunyun
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
local:
dataDir: /var/lib/etcd
extraArgs:
listen-client-urls: https://127.0.0.1:2379,https://10.0.4.13:2379
listen-peer-urls: https://10.0.4.13:2380
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: 1.25.0
scheduler: {}
controlPlaneEndpoint: endpoint.mjclouds.com
networking:
dnsDomain: cluster.local
serviceSubnet: 10.96.0.0/12
podSubnet: 10.244.0.0/16
---
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
cgroupDriver: systemd

确认网卡

某些云厂商不会把外网ip绑定在网卡上,因此在初始化 etcd 的时候会出问题(ETCD默认监听外网ip)

执行ifconfig查看网卡,如果没有绑定外网ip,可以输入ifconfig eth0:1 [外网ip] netmask 255.255.255.0添加一张虚拟网卡

20221017143332

初始化集群

一切准备就绪,使用 kubeadm 初始化集群

1
kubeadm init --config init-config.yaml

一段时间后输出加入集群的指令后,配置完成,请记住join命令,加入节点或创建高可用集群会用得到

20221017143702

现在还无法使用 kubectl,因为kubectl的集群还没有配置

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

现在执行 kubectl get nodes,可以和集群联系了!

安装网络插件

这里使用 flannel

下载 yaml

虽然可以直接使用 kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml,但是为了能方便的进行操作回滚,我选择先下载到本地

1
2
3
wget https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml

kubectl apply -f kube-flannel.yml

当网络插件配置生效,执行kubectl get nodes,可以看见节点已经 Ready,在此之前一直是 NotReady 状态

20221017145950

让 master 可调度

目前我们只有一个单节点,如果想部署服务,集群是默认master不可调度的。我的节点名称叫master-shanghai,使用kubectl describe node master-shanghai可以看见,污点字段写着不可调度:
20221017163432

我们清除这个污点:

1
kubectl taint node master-shanghai node-role.kubernetes.io/control-plane-

污点消失:
20221017163545

配置nginx-ingress

官方教程中,nginx-ingress 使用的镜像依旧是国内访问不到的 registery.k8s.io,但是并没有官方的镜像源。
不过民间出现了热心市民,做了镜像仓库,我们可以在github的issue中找到需要的镜像,并替换进 YAML 文件中

以下命令 1.4.0 替换成自己的合适版本,版本对应关系可在对应关系表查看

1
2
3
4
5
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.4.0/deploy/static/provider/cloud/deploy.yaml

// 省略替换镜像的过程

kubectl apply -f deploy.yml

值得一提的是,如果是单节点,并且没有执行上一步的清楚污点操作,当查看 service,会发现 nginx-service 一直处于等待状态

20221017163729

查看 pods 状态,可见启动成功
20221017173042

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
apiVersion: v1
kind: Service
metadata:
name: nginx-svc
spec:
selector:
app: nginx-pod
type: ClusterIP
ports:
- protocol: TCP
port: 80
targetPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx-deploy
spec:
selector:
matchLabels:
app: nginx-pod
template:
metadata:
labels:
app: nginx-pod
spec:
containers:
- name: nginx
image: ustc-edu-cn.mirror.aliyuncs.com/library/nginx:1.19-alpine
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-deployment-ingress
spec:
ingressClassName: nginx
rules:
- host: k8s.mjclouds.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx-svc
port:
number: 80

国内部署k8s集群.
https://wujunyi792.github.io/2022/10/16/国内部署k8s集群/
作者
Wujunyi
发布于
2022年10月16日
许可协议