kubernetes-36:阿里云ecs上使用kubeadm创建6节点kubernetes集群

网友投稿 838 2022-10-26

本站部分文章、图片属于网络上可搜索到的公开信息,均用于学习和交流用途,不能代表睿象云的观点、立场或意见。我们接受网民的监督,如发现任何违法内容或侵犯了您的权益,请第一时间联系小编邮箱jiasou666@gmail.com 处理。

kubernetes-36:阿里云ecs上使用kubeadm创建6节点kubernetes集群

k8s已经如此成熟,为什么还要自建/自搭?

答:

dev,test环境成本低,成本不仅仅是指的money;还有体系成本,这种方式可以全员参与/学习。发挥新技术/新体系的最大可能,将新技术/新体系最终赋能到整个公司,只有这样才算真的落地。

而且先期在dev,test随意踩坑,踩的越多越有利。

同时,我在每次部署集群时,都会遇到一些新问题(这和我总部署最新版本也有关系),同时也会有意识的使用之前没用过的方式去主动踩坑,通过这种实操方式反过来加深对k8s体系方方面面的理解。

普通公司生产环境肯定要用云平台的,这是显然的。

吐槽:可惜这种工作方式在国内被玩坏了。

友情提示:在大厂、卷厂的别这么玩,活不了几天的,原因上不得台面自行领会。还有一类极端,那种大老板/大领导喜欢直接做到一线码农旁边指挥写代码的(鄙人之前有幸在两家公司遇到),嗯,不仅不要这么玩,你赶快跑。

目录:

(1).机器准备

(2).前置准备

(3).节点做免密

(4).安装harbor镜像仓库

(5).安装kubernetes

(6).初始化k8s

(7).安装网络

(8).安装另外两个master节点

(9).安装三个work节点

(10).补充

(1).机器准备

3台2c4g的master node,3台8c32g的work node。

(2).前置准备

1.我们需要禁用 swap。

# 不关闭swap初始化会报错,有办法跳过,但是建议还是关闭

swapoff -a

2.关闭selinux

setenforce 0

sed -i 's/^ *SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

3.安装docker:

移除老版本

sudo yum remove docker \

docker-client \

docker-client-latest \

docker-common \

docker-latest \

docker-latest-logrotate \

docker-logrotate \

docker-selinux \

docker-engine-selinux \

docker-engine

设置资源库

sudo yum install -y yum-utils \

device-mapper-persistent-data \

lvm2

sudo yum-config-manager \

--add-repo \

https://download.docker.com/linux/centos/docker-ce.repo

查看docker版本:

yum list docker-ce --showduplicates | sort -r

然后可以直接装docker:

yum install -y docker-ce-20.10.7-3.el7.x86_64

sudo systemctl start docker

(3).节点做免密

在scp发起的机器执行命令生成公私钥:

ssh-keygen

在~/.ssh目录下生成两个文件(id_rsa           id_rsa.pub)文件,再把id_rsa.pub文件内容放到scp传输目标机的对应用户下的.ssh目录的authorized_keys里:

ssh-rsa xxx root@jenkins

注意:authorized_keys的权限是600。

(4).安装harbor镜像仓库

原因:阿里云ECS不通国外,需要通过私有仓库拉取http://k8s.gcr.io等镜像。

使用docker构建私有镜像仓库即可。

k8s的各个node配置harbor仓库相关:

配置1修改(每个node都要做):

vim /usr/lib/systemd/system/docker.service

修改配置文件,ExecStart之后添加--insecure-registry http://harbor仓库ip

docker login harbor-ip

配置2修改(每个node都要做):

/etc/docker/daemon.json

docker默认443拉image,需要配置成http的方式:

重新load配置:systemctl daemon-reload

重启docker:systemctl restart docker

在harbor上新建一个项目:kubernetes,k8s基本组件(需要翻墙)做本地化通过docker push的时候作为tag的一部分推到这个项目下。

(5).安装kubernetes

/etc/yum.repos.d/kubernetes.repo文件增加内容

[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

yum clean all

yum -y makecache

yum list kubelet --showduplicates | sort -r

yum install -y kubelet-1.21.2-0 kubeadm-1.21.2-0 kubectl-1.21.2-0

systemctl enable kubelet && systemctl start kubelet

echo "source <(kubectl completion bash)" >> ~/.bash_profile

source ~/.bash_profile

(6).初始化k8s

在运行 kubeadm init 之前可以先执行来测试与 gcr.io 的连接 :

kubeadm config images pull --image-repository=harbor私有仓库IP/kubernetes

kubeadm config images pull尝试是否可以拉取镜像,由于国内访问"k8s.gcr.io", "gcr.io", "quay.io" 有困难,这里采用自建docker register的方式。

肯定是拉不下来的。

先通过命令查看各个组件的具体版本:

kubeadm config images list

写个脚本完成k8s基本镜像的下载&tag&推送到我们的私有镜像仓库。

xxx要替换成你的harbor地址。

[root@dev-k8s-master001 ~]# cat dl-k8s-harbor.sh

docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.21.2

docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.21.2

docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.21.2

docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.21.2

docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.4.1

docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.13-0

docker pull coredns/coredns:1.8.0

docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.21.2 Xxx/kubernetes/kube-apiserver:v1.21.2-0

docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.21.2 Xxx/kubernetes/kube-controller-manager:v1.21.2-0

docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.21.2 Xxx/kubernetes/kube-scheduler:v1.21.2-0

docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.21.2 Xxx/kubernetes/kube-proxy:v1.21.2-0

docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.4.1 Xxx/kubernetes/pause:3.4.1

docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.13-0 Xxx/kubernetes/etcd:3.4.13-0

docker tag coredns/coredns:1.8.0 Xxx/kubernetes/coredns:v1.8.0

docker push Xxx/kubernetes/kube-apiserver:v1.21.2-0

docker push Xxx/kubernetes/kube-controller-manager:v1.21.2-0

docker push Xxx/kubernetes/kube-scheduler:v1.21.2-0

docker push Xxx/kubernetes/kube-proxy:v1.21.2-0

docker push Xxx/kubernetes/pause:3.4.1

docker push Xxx/kubernetes/etcd:3.4.13-0

docker push Xxx/kubernetes/coredns:v1.8.0

kubeadm init --pod-network-cidr=10.244.0.0/16 --kubernetes-version=v1.21.2-0 --image-repository=Xxx/kubernetes

等一会儿后根据提示操作:

To start using your cluster, you need to run the following as a regular user:

(如果想启动你的集群,需要执行):

mkdir -p $HOME/.kube

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

sudo chown $(id -u):$(id -g) $HOME/.kube/config

Alternatively, if you are the root user, you can run:

export KUBECONFIG=/etc/kubernetes/admin.conf

可以改为:

echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile

source ~/.bash_profile

You should now deploy a pod network to the cluster.

Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:

https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

(其他节点加入这个集群需要执行):

kubeadm join 172.31.41.180:6443 --token egbpio.kt24aljvxxtp0uk2 \

--discovery-token-ca-cert-hash sha256:a2dd5e0de33a435cfdeedb4f935a3b6c1931a49fab8fee77925d0f6f9c0e298e

我们查看一下集群:kubectl get nodes

因为没有安装网络,所以不可用。

kubectl get pods看到的pod也是不可用状态。

(7).安装网络

# 官网链接

# https://v1-20.docs.kubernetes.io/zh/docs/concepts/cluster-administration/networking/#how-to-implement-the-kubernetes-networking-model

# 此处选择简单的flannel,如果有更高性能要求可以选择calico

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

# 执行完后验证:

kubectl get pods -A

kubectl get nodes

至此,这个节点安装完成。

(8).安装另外两个master节点

重复(1)到(3)的步骤,然后将master001的证书拷贝到其他master节点:

USER=root

CONTROL_PLANE_IPS="node-02 node-03"

for host in ${CONTROL_PLANE_IPS}; do

ssh "${USER}"@$host "mkdir -p /etc/kubernetes/pki/etcd"

scp /etc/kubernetes/pki/ca.* "${USER}"@$host:/etc/kubernetes/pki/

scp /etc/kubernetes/pki/sa.* "${USER}"@$host:/etc/kubernetes/pki/

scp /etc/kubernetes/pki/front-proxy-ca.* "${USER}"@$host:/etc/kubernetes/pki/

scp /etc/kubernetes/pki/etcd/ca.* "${USER}"@$host:/etc/kubernetes/pki/etcd/

scp /etc/kubernetes/admin.conf "${USER}"@$host:/etc/kubernetes/

done

上边的同步脚本将主节点中的【/etc/kubernetes/admin.conf】文件拷贝到从节点相同目录下,然后配置环境变量:

echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile

立即生效

source ~/.bash_profile

然后使用(4)中的join命令,将master加入集群。

kubeadm join 172.31.41.180:6443 --token egbpio.kt24aljvxxtp0uk2 \

--discovery-token-ca-cert-hash sha256:a2dd5e0de33a435cfdeedb4f935a3b6c1931a49fab8fee77925d0f6f9c0e298e --control-plane

--control-plane表示加入的这个节点是master。

执行报错:

查看一下 kubeadm-config.yaml

kubectl -n kube-system get cm kubeadm-config -o yaml

发现controlPlaneEndpoint的值是空的.

走,去改他.

kubectl -n kube-system edit cm kubeadm-config

编辑yaml文件,要设置controlPlaneEndpoint配置,应将kubeadm与--config标志一起使用。查看here作为配置文件示例:

再次执行join命令,成功:然后顺次执行红色框中命令。

这个时候我们在执行:kubectl get pods -A

可以看到两个master都有集群管理pod。

(9).安装三个work节点

重复(1)到(3)的步骤,然后将master001的证书拷贝到其他master节点:

USER=root

CONTROL_PLANE_IPS="node-02 node-03"

for host in ${CONTROL_PLANE_IPS}; do

ssh "${USER}"@$host "mkdir -p /etc/kubernetes/pki/etcd"

scp /etc/kubernetes/pki/ca.* "${USER}"@$host:/etc/kubernetes/pki/

scp /etc/kubernetes/pki/sa.* "${USER}"@$host:/etc/kubernetes/pki/

scp /etc/kubernetes/pki/front-proxy-ca.* "${USER}"@$host:/etc/kubernetes/pki/

scp /etc/kubernetes/pki/etcd/ca.* "${USER}"@$host:/etc/kubernetes/pki/etcd/

scp /etc/kubernetes/admin.conf "${USER}"@$host:/etc/kubernetes/

done

上边的同步脚本将主节点中的【/etc/kubernetes/admin.conf】文件拷贝到从节点相同目录下,然后配置环境变量:

echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile

立即生效

source ~/.bash_profile

然后使用(4)中的join命令,将master加入集群。

kubeadm join 172.31.41.180:6443 --token egbpio.kt24aljvxxtp0uk2 \

--discovery-token-ca-cert-hash sha256:a2dd5e0de33a435cfdeedb4f935a3b6c1931a49fab8fee77925d0f6f9c0e298e

可能会报错:

将ca.crt做个backup再次执行即可:

增加完三个work后,在查看pods和nodes:

(10).补充

1.如果join命令忘记了,可以通过如下命令获取

kubeadm token create --print-join-command

2.k8s一个小瑕疵

版本检查和实际安装版本不一致:

上一篇:连接比今天的网络更多设备的能力
下一篇:下一代的无线网络,姑且称为SG移动网络
相关文章

 发表评论

暂时没有评论,来抢沙发吧~