下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

Kubeadm部署一主两从的Kubernetes集群

作者:匿名     来源: 云计算点击数:1225发布时间: 2022-06-08 22:44:45

标签: kubeadm云原生

  本文采用kubeadm部署一主两从的kubernetes集群,供测试使用,并包含了网络插件和一个简单nginx服务部署的例子。

  kubernetes集群大体上分为两类:一主多从和多主多从。

  一主多从:一台Master节点和多台Node节点,搭建简单,但是有单机故障风险,适合用于测试环境。

  多主多从:多台Master节点和多台Node节点,搭建麻烦,适合用于生产环境。

  本文采用kubeadm部署一主两从的kubernetes集群,供测试使用,并包含了网络插件和一个简单nginx服务部署的例子。

  一、禁用swap分区

  复制

  1. swapoff -a

  swap分区指的是虚拟内存分区,它的作用是在物理内存使用完毕后,将磁盘空间虚拟成内存来使用。

  启动swap设备会对系统的性能产生非常负面的影响,这里把swap分区关闭。

  复制

  1. vim /etc/fstab

  注释掉最后一行。

  二、安装docker(三个节点)

  1、切换镜像源

  复制

  1. wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo

  2、查看前镜像源中支持的docker版本

  复制

  1. yum list docker-ce --showduplicates

  3、安装指定版本docker(带上–setopt=obsoletes=0,使用指定版本)

  复制

  yum install --setopt=obsoletes=0 docker-ce-18.06.3.ce-3.el7 -y

  4、添加配置文件

  Docker在默认情况下使用的Cgroup Driver为cgroupfs,而kubernetes推荐使用systemd来代替cgroupfs。

  复制

  1. mkdir /etc/docker

  2.

      3. cat < /etc/docker/daemon.json

  4. {

  5. "exec-opts": ["native.cgroupdriver=systemd"],

  6. "registry-mirrors": ["https://kn0t2bca.mirror.aliyuncs.com"]

  7. }

  8. EOF

  5、启动docker

  复制

  1. systemctl restart docker

  2. systemctl enable docker

  三、安装kubernetes组件(三个节点)

  1、配置镜像源

  复制

  1. vim /etc/yum.repos.d/kubernetes.repo

  2. [kubernetes]

  3. name=Kubernetes

  4.baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64

  5. enabled=1

  6. gpgcheck=0

  7. repo_gpgcheck=0

  8. gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg

  9. http://mirrors.aliyum.com/kubernetes/yum/doc/rpm-package-key.gpg

  2、安装指定版本的kubeadm,kubelet和kubectl

  复制

  1. yum install --setopt=obsoletes=0 kubeadm-1.23.6-0 kubelet-1.23.6-0 kubectl-1.23.6-0 -y

  3、修改/etc/sysconfig/kubelet的内容,将里边内容替换

  复制

  1. vim /etc/sysconfig/kubelet

  2. KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"

  3. KUBE_PROXY_MODE="ipvs"

  4、设置kubelet开机自启

  复制

  1. systemctl enable kubelet

  四、准备集群镜像

  这步是为第五步的kubeadm init做准备,因为init会拉取镜像,而此镜像在kubernetes的仓库中,由于网络原因,无法连接,因此用如下方法。

  复制

  1. vim ima.sh

  添加内容。

  复制

  1. images=(

  2. kube-apiserver:v1.23.6

  3. kube-controller-manager:v1.23.6

  4. kube-scheduler:v1.23.6

  5. kube-proxy:v1.23.6

  6. pause:3.6

  7. etcd:3.5.1-0

  8. coredns:v1.8.6

  9. )

  10. for list in ${images[@]} ; do

  11. docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$list

  12. docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$list k8s.gcr.io/$list

  13. done

  14. docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:v1.8.6 k8s.gcr.io/coredns/coredns:v1.8.61.2.3.4.5.6.7.8.9.10.11.12.13.14.

  复制

  1. sh ima.sh

  五、集群初始化(主节点)

  1、主节点创建集群

  复制

  1. kubeadm init \\

  2. --kubernetes-version=v1.23.6 \\

  3. --pod-network-cidr=10.0.0.0/16 \\

  4. --service-cidr=10.0.0.0/12 \\

  5. --apiserver-advertise-address=172.20.10.6

  记录下最后结尾的几个命令。

  如果初始化失败了,使用如下命令清理环境,并重新初始化。

  kubeadm reset

  rm -rf $HOME/.kube

  systemctl restart kubelet

  2、创建必要文件

  复制

  1. mkdir -p $HOME/.kube

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

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

  六、备机初始化

  使用kubeadm init 结尾提示的kubeadm join语句初始化备机,如果忘记kubeadm join语句可以通过如下命令在主节点获取join命令参数:

  复制

  1. kubeadm token create --print-join-command

  在两个备机执行改语句,加入集群,结果如下:

  提示在control-plane执行kubectl get nodes查看节点状态,即在主节点执行,发现节点的status都是NotReady的状态,这是因为没有安装网络插件的原因。

  复制

  1. kubectl get nodes

  七、安装网络插件——calico

  kubernetes支持多种网络插件,比如flannel、calica、canal等等,任选一种使用即可,本次选择calico。

  网络插件没有安装的话,节点是 <font color=“#dd00dd”>NotReady</font> 状态,因为CoreDNS没有网络插件分配不到IP地址,会一直处于Pending状态。

  如果没有这个插件,kubedns无法启动,pod之间就无法通信。

  <font color=“#dd00dd”>只在主节点执行即可,插件使用的是DaemonSet的控制器,它会在每个节点上都运行。</font><br />。

  1、获取配置文件并apply

  curl ​​https://projectcalico.docs.tigera.io/manifests/calico.yaml​​ -O。

  2、查看服务状态,都是running了

  再次查看节点状态,发现所有的节点都是 Ready 的状态了。

  八、部署CoreDNS

  复制

  1. git clone https://github.com/coredns/deployment.git

  2. yum -y install epel-release

  3. yum -y install jq

  4. cd deployment/kubernetes/

  5. ./deploy.sh -i 10.0.0.254 > coredns.yaml

  6. kubectl apply -f coredns.yaml

  用命令查看状态,发现pod处于ContainerCreating状态。

  复制

  1. kubectl get pod,svc -A

  使用kubectl describe查看该coredns的pod,发现在拉取coredns的镜像,稍微等待一会。

  复制

  1. kubectl describe pod coredns-799bc9dbc6-m7q4t -n kube-system

  等待一会后查看events,发现终于拉取成功了。

  查看pod和svc状态,都是running的。

  复制

  1. kubectl get pod,svc -A

  九、kubernetes-dashboard的部署

  1、获取yaml文件

  复制

  1. wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.4.0/aio/deploy/recommended.yaml

  2、增加配置,使Dashboard暴露到外部

  复制

  2. vim recommended.yaml

  因为默认Dashboard只能集群内部访问,修改Service为NodePort类型,暴露到外部。

  3、apply修改后的recommended.yaml

  复制

  1. kubectl apply -f recommended.yaml

  4、查看kubernetes-dashboard的pod状态,都已经是running的

  复制

  1. kubectl get pods -n kubernetes-dashboard

  5、访问网址

  https://NodeIP:30001。

  我的主节点地址为172.20.10.6,因此访问https://172.20.10.6:30001。

  6、创建service account并绑定默认cluster-admin管理员集群角色:

  创建用户:

  复制

  1. kubectl create serviceaccount dashboard-admin -n kube-system

  用户授权:

  复制

  1. kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin

  获取用户Token:

  复制

  1. kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')

  7、使用输出的token登录Dashboard。

  可以查看当前k8s的相关信息,例如nodes,namespace等。

  十、使用k8s简单部署一个nginx

  1、根据yaml创建namespace

  复制

  1. vim nginx-namespace.yaml

  2. 内容如下

  3. apiVersion: v1 #类型为Namespace

  4. kind: Namespace #类型为Namespace

  5. metadata:

  6. name: ns-test #命名空间名称

  7. labels:

  8. name: label-test #pod标签

  创建namespace:

  复制

  1. [root@pg01 ~]# kubectl create -f nginx-namespace.yaml

  2. namespace/ns-test created

  查询namespace:

  复制

  1. [root@pg01 ~]# kubectl get namespace

  2. NAME STATUS AGE

  3. default Active 92m

  4. kube-node-lease Active 92m

  5. kube-public Active 92m

  6. kube-system Active 92m

  7. kubernetes-dashboard Active 21m

  8. ns-test Active 5s

  2、创建pod

  一般不直接create pod,而是通过controller来创建pod。deployment为其中一种controller

  拉取nginx镜像:

  复制

  1. docker pull nginx

  编辑pod的yaml文件:

  复制

  2. vim nginx-deployment.yaml

  内容如下:

  复制

  1. apiVersion: apps/v1

  2. kind: Deployment

  3. metadata:

  4. namespace: ns-test

  5. name: nginx-deployment

  6. spec:

  7. selector:

  8. matchLabels:

  9. app: nginx

  10. replicas: 2

  11. template:

  12. metadata:

  13. labels:

  14. app: nginx

  15. spec:

  16. containers:

  17. - name: nginx

  18. image: nginx:latest

  19. ports:

  20. - containerPort: 80

  创建:

  复制

  1. kubectl create -f nginx-deployment.yaml

  查询:

  复制

  1. kubectl get pods -n ns-test

  2. kubectl get deployment -n ns-test

  nginx-deployment 部署的2个 pod 全部成功。

  查看两个nginx分配的ip。

  复制

  1. kubectl get pods -o wide -n ns-test

  访问测试:

  复制

  1. curl http://10.0.181.5

  3、创建service

  创建对应yaml文件:

  复制

  1. vim nginx-service.yaml

  内容如下:

  复制

  1. apiVersion: v1

  2. kind: Service

  3. metadata:

  4. namespace: ns-test

  5. name: nginx-service

  6. spec:

  7. selector:

  8. app: nginx

  9. ports:

  10. - protocol: TCP

  11. port: 80

  12. targetPort: 80

  创建service:

  复制

  1. kubectl create -f nginx-service.yaml

  查看service:

  复制

  1. kubectl get svc nginx-service -o wide -n ns-tes

  访问测试:

  4、暴露端口部署nginx服务

  nginx-service.yaml文件如下:

  复制

  1. apiVersion: v1

  2. kind: Service

  3. metadata:

  4. labels:

  5. app: nginx

  6. name: nginx-service

  7. namespace: ns-test

  8. spec:

  9. ports:

  10. - port: 9000

  11. name: nginx-service

  12. protocol: TCP

  13. targetPort: 80 # 容器nginx对外开放的端口 上面的dm已经指定了

  14. nodePort: 31090 #外网访问的端口

  15. selector:

  16. app: nginx

  17. type: NodePort

  部署服务。

  复制

  1. kubectl create -f nginx-service.yaml

  查看服务和端口。

  复制

  1. kubectl get svc nginx-service -n ns-test

  测试如下:

  浏览器用主节点所在的ip访问k8s的nginx,我的主节点ip为172.20.10.6,则访问http://172.20.10.6:31090/,结果如下:

  来源: 鸿蒙社区

    >>>>>>点击进入计算专题

赞(8)
踩(0)
分享到:
华为认证网络工程师 HCIE直播课视频教程