国内云服务,快速部署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"]
|
打开必要端口
安装 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 命令允许使用命令行指定各个参数,但是参数太多了,不如直接写成一个配置文件
这是我的,当然可以使用 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
|
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 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
添加一张虚拟网卡
初始化集群
一切准备就绪,使用 kubeadm 初始化集群
1
| kubeadm init --config init-config.yaml
|
一段时间后输出加入集群的指令后,配置完成,请记住join命令,加入节点或创建高可用集群会用得到
现在还无法使用 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 状态
让 master 可调度
目前我们只有一个单节点,如果想部署服务,集群是默认master不可调度的。我的节点名称叫master-shanghai
,使用kubectl describe node master-shanghai
可以看见,污点字段写着不可调度:
我们清除这个污点:
1
| kubectl taint node master-shanghai node-role.kubernetes.io/control-plane-
|
污点消失:
配置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 一直处于等待状态
查看 pods 状态,可见启动成功
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
|