k8s入门到实战(三)—— 三台服务器从零开始搭建k8s集群 ...

打印 上一主题 下一主题

主题 842|帖子 842|积分 2526

服务器裸机搭建 k8s 集群

情况准备


  • 至少3个服务器(本次利用3台阿里云服务器),4核4G以上(按量付费),内网要能相互通信,也就是必须要在同一个网段下
本次实验的3个服务器私网 ip 如下:
  1. 192.168.0.1 (主机)
  2. 192.168.0.2
  3. 192.168.0.3
复制代码
这3个服务器一台为 master node(初始化主节点)、两台 work node(工作节点)

  • 3个服务器都要安装 docker
3个服务器同时实行命令:
在输入命令行位置右键发送键输入到全部会话
  1. # 移除之前安装的 docker
  2. sudo yum remove docker \
  3.                   docker-client \
  4.                   docker-client-latest \
  5.                   docker-common \
  6.                   docker-latest \
  7.                   docker-latest-logrotate \
  8.                   docker-logrotate \
  9.                   docker-engine
  10.                   
  11. # 安装 gcc 环境
  12. sudo yum install -y gcc
  13. sudo yum install -y gcc-c++
  14. # 配置yum源
  15. sudo yum install -y yum-utils
  16. # 使用国内的镜像。
  17. sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  18. # 更新 yum 索引
  19. sudo yum makecache fast
  20. # 安装 docker
  21. sudo yum install -y docker-ce docker-ce-cli containerd.io
  22. # 配置阿里云镜像加速,在自己的阿里云镜像加速器查看
  23. sudo mkdir -p /etc/docker
  24. sudo tee /etc/docker/daemon.json <<-'EOF'
  25. {
  26.   "registry-mirrors": ["https://g8vxwvax.mirror.aliyuncs.com"]
  27. }
  28. EOF
  29. sudo systemctl daemon-reload
  30. sudo systemctl restart docker
  31. # 设置开机启动Docker
  32. sudo systemctl enable docker
  33. # 检查是否安装成功
  34. docker -v
复制代码


  • 安装 k8s 前的系统情况准备,官方要求
  1. # 节点之中不可以有重复的主机名,mac地址等,设置不同的hostname
  2. # 3个服务器分别执行
  3. hostnamectl set-hostname k8s-master
  4. hostnamectl set-hostname k8s-node1
  5. hostnamectl set-hostname k8s-node2
  6. # 3台服务器全部执行
  7. # 关闭防火墙
  8. sudo systemctl stop firewalld
  9. sudo systemctl disable firewalld
  10. # 将 SElinux 设置为 permissive 模式,禁用
  11. sudo setenforce 0
  12. sudo sed -i 's/^SELINUX=enforcin$/SELINUX=permissive/' /etc/selinux/config
  13. # 关闭swap分区
  14. sudo swapoff -a
  15. sudo sed -ri 's/.*swap.*/#&/' /etc/fstab
  16. # 允许 iptables 检查桥接流量(所有节点)
  17. cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
  18. br_netfilter
  19. EOF
  20. cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
  21. net.bridge.bridge-nf-call-ip6tables = 1
  22. net.bridge.bridge-nf-call-iptables = 1
  23. EOF
  24. sudo sysctl --system
复制代码
至此,我们的全部情况就配置好了,接下来就要搭建 k8s 集群了
安装集群三大件 kubelet、kubeadm、kubectl

你需要在每台呆板上安装以下的软件包:


  • kubeadm:用来初始化集群的指令。
  • kubelet:在集群中的每个节点上用来启动 Pod 和容器等。
  • kubectl:用来与集群通信的命令行工具。
参考阿里巴巴开源镜像站 k8s 安装步骤:https://developer.aliyun.com/mirror/kubernetes
  1. # 3台服务器全部执行
  2. # 安装 kubeadm、kubelet 和 kubectl,配置yum文件,因为国内无法直接访问google,这里需要将官网中的google的源改为国内源
  3. cat <<EOF > /etc/yum.repos.d/kubernetes.repo
  4. [kubernetes]
  5. name=Kubernetes
  6. baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
  7. enabled=1
  8. gpgcheck=1
  9. repo_gpgcheck=1
  10. gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
  11. EOF
  12. setenforce 0
  13. yum install -y kubelet kubeadm kubectl
  14. systemctl enable kubelet && systemctl start kubelet
  15. # 查看版本信息
  16. kubectl version
复制代码

在 k8s v1.24 及更早版本中,我们利用 docker 作为容器引擎在 k8s 上利用时,依赖一个 dockershim 的内置 k8s 组件,k8s v1.24发行版中将dockershim 组件给移除了,取而代之的就是 cri-dockerd(当然还有其它容器接口),简单讲 CRI 就是容器运行时接口(Container Runtime Interface,CRI),也就是说 cri-dockerd 就是以 docker 作为容器引擎而提供的容器运行时接口,如果我们想要用 docker 作为 k8s 的容器运行引擎,我们需要先部署好 cri-dockerd,用 cri-dockerd 来与 kubelet 交互,然后再由 cri-dockerd 和 docker api 交互,使我们在 k8s 可以或许正常利用 docker 作为容器引擎。
  1. # 下载
  2. wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.4/cri-dockerd-0.3.4.amd64.tgz
  3. # 解压cri-docker
  4. tar xvf cri-dockerd-*.amd64.tgz
  5. cp -r cri-dockerd/  /usr/bin/
  6. chmod +x /usr/bin/cri-dockerd/cri-dockerd
  7. # 写入启动cri-docker配置文件
  8. cat >  /usr/lib/systemd/system/cri-docker.service <<EOF
  9. [Unit]
  10. Description=CRI Interface for Docker Application Container Engine
  11. Documentation=https://docs.mirantis.com
  12. After=network-online.target firewalld.service docker.service
  13. Wants=network-online.target
  14. Requires=cri-docker.socket
  15. [Service]
  16. Type=notify
  17. ExecStart=/usr/bin/cri-dockerd/cri-dockerd --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.7
  18. ExecReload=/bin/kill -s HUP $MAINPID
  19. TimeoutSec=0
  20. RestartSec=2
  21. Restart=always
  22. StartLimitBurst=3
  23. StartLimitInterval=60s
  24. LimitNOFILE=infinity
  25. LimitNPROC=infinity
  26. LimitCORE=infinity
  27. TasksMax=infinity
  28. Delegate=yes
  29. KillMode=process
  30. [Install]
  31. WantedBy=multi-user.target
  32. EOF
  33. # 写入cri-docker的socket配置文件
  34. cat > /usr/lib/systemd/system/cri-docker.socket <<EOF
  35. [Unit]
  36. Description=CRI Docker Socket for the API
  37. PartOf=cri-docker.service
  38. [Socket]
  39. ListenStream=%t/cri-dockerd.sock
  40. SocketMode=0660
  41. SocketUser=root
  42. SocketGroup=docker
  43. [Install]
  44. WantedBy=sockets.target
  45. EOF
  46. # 当你新增或修改了某个单位文件(如.service文件、.socket文件等),需要运行该命令来刷新systemd对该文件的配置。
  47. systemctl daemon-reload
  48. # 确保docker是启动的
  49. # 启用并立即启动cri-docker.service单元。
  50. systemctl enable --now cri-docker.service
  51. # 显示docker.service单元的当前状态,包括运行状态、是否启用等信息。
  52. systemctl status cri-docker.service
复制代码
出现以下内容阐明启动乐成:
  1. [root@k8s-master ~]# systemctl status cri-docker.service
  2. ● cri-docker.service - CRI Interface for Docker Application Container Engine
  3.    Loaded: loaded (/usr/lib/systemd/system/cri-docker.service; enabled; vendor preset: disabled)
  4.    Active: active (running) since Sun 2024-03-24 16:01:06 CST; 9s ago
  5.      Docs: https://docs.mirantis.com
  6. Main PID: 3238 (cri-dockerd)
  7.     Tasks: 9
  8.    Memory: 14.5M
  9.    CGroup: /system.slice/cri-docker.service
  10.            └─3238 /usr/bin/cri-dockerd/cri-dockerd --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/googl...
  11. Mar 24 16:01:06 k8s-master cri-dockerd[3238]: time="2024-03-24T16:01:06+08:00" level=info msg="Start docker client with r...ut 0s"
  12. Mar 24 16:01:06 k8s-master cri-dockerd[3238]: time="2024-03-24T16:01:06+08:00" level=info msg="Hairpin mode is set to none"
  13. Mar 24 16:01:06 k8s-master cri-dockerd[3238]: time="2024-03-24T16:01:06+08:00" level=info msg="Loaded network plugin cni"
  14. Mar 24 16:01:06 k8s-master cri-dockerd[3238]: time="2024-03-24T16:01:06+08:00" level=info msg="Docker cri networking mana...n cni"
  15. Mar 24 16:01:06 k8s-master cri-dockerd[3238]: time="2024-03-24T16:01:06+08:00" level=info msg="Docker Info: &{ID:a848d1ba... [Nati
  16. Mar 24 16:01:06 k8s-master cri-dockerd[3238]: time="2024-03-24T16:01:06+08:00" level=info msg="Setting cgroupDriver cgroupfs"
  17. Mar 24 16:01:06 k8s-master cri-dockerd[3238]: time="2024-03-24T16:01:06+08:00" level=info msg="Docker cri received runtim...:,},}"
  18. Mar 24 16:01:06 k8s-master cri-dockerd[3238]: time="2024-03-24T16:01:06+08:00" level=info msg="Starting the GRPC backend ...face."
  19. Mar 24 16:01:06 k8s-master cri-dockerd[3238]: time="2024-03-24T16:01:06+08:00" level=info msg="Start cri-dockerd grpc backend"
  20. Mar 24 16:01:06 k8s-master systemd[1]: Started CRI Interface for Docker Application Container Engine.
  21. Hint: Some lines were ellipsized, use -l to show in full.
复制代码
  总结:情况准备
  

  • 呆板情况
  • 安装了 k8s 的组件
  • 安装 cri 情况
安装并初始化 master 节点

  1. # 所有机器添加master节点的域名映射,这里要改为自己当下master的ip
  2. echo "192.168.0.1 cluster-master" >> /etc/hosts
  3. # node节点ping测试映射是否成功
  4. ping cluster-master
  5. # 如果init失败,可以kubeadm重置
  6. kubeadm reset --cri-socket unix:///var/run/cri-dockerd.sock
  7. ####### 主节点初始化(只在master执行) #######
  8. # 注意修改apiserver的地址为master节点的ip
  9. ## 注意service、pod的网络节点不能和master网络ip重叠
  10. kubeadm init \
  11. --apiserver-advertise-address=192.168.0.1 \
  12. --control-plane-endpoint=cluster-master \
  13. --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
  14. --kubernetes-version v1.28.2 \
  15. --service-cidr=10.96.0.0/16 \
  16. --pod-network-cidr=192.169.0.0/16 \
  17. --cri-socket unix:///var/run/cri-dockerd.sock
复制代码
等待命令运行完毕即可,实行乐成后可以看到
  1. [root@k8s-master ~]# kubeadm init \
  2. > --apiserver-advertise-address=192.168.0.1 \
  3. > --control-plane-endpoint=cluster-master \
  4. > --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
  5. > --kubernetes-version v1.28.2 \
  6. > --service-cidr=10.96.0.0/16 \
  7. > --pod-network-cidr=192.169.0.0/16 \
  8. > --cri-socket unix:///var/run/cri-dockerd.sock
  9. [init] Using Kubernetes version: v1.28.2
  10. ......
  11. [addons] Applied essential addon: CoreDNS
  12. [addons] Applied essential addon: kube-proxy
  13. Your Kubernetes control-plane has initialized successfully!
  14. To start using your cluster, you need to run the following as a regular user:
  15.   mkdir -p $HOME/.kube
  16.   sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  17.   sudo chown $(id -u):$(id -g) $HOME/.kube/config
  18. Alternatively, if you are the root user, you can run:
  19.   export KUBECONFIG=/etc/kubernetes/admin.conf
  20. You should now deploy a pod network to the cluster.
  21. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  22.   https://kubernetes.io/docs/concepts/cluster-administration/addons/
  23. You can now join any number of control-plane nodes by copying certificate authorities
  24. and service account keys on each node and then running the following as root:
  25.   kubeadm join cluster-master:6443 --token 9jk1zp.v738zd885ew7m7lp \
  26.         --discovery-token-ca-cert-hash sha256:6a1cb9a74d02f28b06471114e28faa8de6cbc3501eb3a9a989123840c281e85a \
  27.         --control-plane
  28. Then you can join any number of worker nodes by running the following on each as root:
  29. kubeadm join cluster-master:6443 --token 9jk1zp.v738zd885ew7m7lp \
  30.         --discovery-token-ca-cert-hash sha256:6a1cb9a74d02f28b06471114e28faa8de6cbc3501eb3a9a989123840c281e85a
复制代码
根据上面的提示信息,我们在 master 中实行以下命令:
  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
  4. export KUBECONFIG=/etc/kubernetes/admin.conf
复制代码
初始化完成后,可以利用命令查看节点信息了
  1. kubectl get nodes
复制代码
  1. # 发现是 NotReady 状态[root@k8s-master ~]# kubectl get nodes
  2. NAME         STATUS     ROLES           AGE     VERSIONk8s-master   NotReady   control-plane   5m47s   v1.28.2
复制代码
work 节点参加集群

参加节点命令,此命令的参数是在初始化完成后给出的,每个人的都不一样,需要复制自己生成的。
是上面初始化 master 节点实行后信息的末了几行,查看自己生成的
  1. Then you can join any number of worker nodes by running the following on each as root:
  2. kubeadm join cluster-master:6443 --token 9jk1zp.v738zd885ew7m7lp \
  3.         --discovery-token-ca-cert-hash sha256:6a1cb9a74d02f28b06471114e28faa8de6cbc3501eb3a9a989123840c281e85a
复制代码
根据自己生成的信息实行以下命令:
  1. kubeadm join cluster-master:6443 --token 9jk1zp.v738zd885ew7m7lp \
  2.         --discovery-token-ca-cert-hash sha256:6a1cb9a74d02f28b06471114e28faa8de6cbc3501eb3a9a989123840c281e85a \
  3.         --cri-socket unix:///var/run/cri-dockerd.sock
  4. # 需要注意的是,如果由于当前版本不再默认支持docker,如果服务器使用的docker,需要在命令后面加入参数--cri-socket unix:///var/run/cri-dockerd.sock。
复制代码
实行完成后,在 master 主机上查看节点信息
  1. [root@k8s-master ~]# kubectl get nodes
  2. NAME         STATUS     ROLES           AGE   VERSIONk8s-master   NotReady   control-plane   11m   v1.28.2k8s-node1    NotReady   <none>          13s   v1.28.2k8s-node2    NotReady   <none>          7s    v1.28.2
复制代码
  1. #另外token默认的有效期为24小时,过期之后就不能用了,需要重新创建token,操作如下
  2. kubeadm token create --print-join-command
  3. # 另外,短时间内生成多个token时,生成新token后建议删除前一个旧的。
  4. # 查看命令
  5. kubeadm token list
  6. # 删除命令
  7. kubeadm token delete tokenid
复制代码
部署 calico

我们需要部署一个 pod 网络插件,安装 Pod 网络是 Pod 之间进行通信的须要条件,k8s 支持众多网络方案,这里选用 calico 方案。
文档:https://kubernetes.io/docs/concepts/cluster-administration/addons/
calico 汗青版本地址:https://docs.tigera.io/archive#v3.1.7
  1. # 下载calico.yml
  2. curl https://docs.tigera.io/archive/v3.25/manifests/calico.yaml -O
复制代码
我们 initmaster 上面配置的 --pod-network-cidr=192.169.0.0/16,这里面也要对应修改

可能存在的题目:calico 默认会找 eth0 网卡,如果当前呆板网卡不是这个名字,可能会无法启动,需要手动配置以下。
利用以下命令查找:
  1. ll /etc/sysconfig/network-scripts/
复制代码

框起来的就是网卡名字,我这里是 eth0。如果是用虚拟机搭建的,网卡名字可能不同
如果网卡名字不是 eth0,需要编辑calico.yaml配置文件参加如下内容 ,在 CLUSTER_TYPE 同级目录下
  1. - name: IP_AUTODETECTION_METHOD
  2.   value: "interface=eth0"                        # 改成你自己的网卡名字
复制代码
网卡名字为 eth0 的则不需要配置

修改完配置后,我们应用一下,应用完毕之后需要等待一下。
  1. kubectl apply -f calico.yaml
复制代码
  1. [root@k8s-master ~]# kubectl apply -f calico.yaml
  2. poddisruptionbudget.policy/calico-kube-controllers createdserviceaccount/calico-kube-controllers createdserviceaccount/calico-node createdconfigmap/calico-config createdcustomresourcedefinition.apiextensions.k8s.io/bgpconfigurations.crd.projectcalico.org createdcustomresourcedefinition.apiextensions.k8s.io/bgppeers.crd.projectcalico.org createdcustomresourcedefinition.apiextensions.k8s.io/blockaffinities.crd.projectcalico.org createdcustomresourcedefinition.apiextensions.k8s.io/caliconodestatuses.crd.projectcalico.org createdcustomresourcedefinition.apiextensions.k8s.io/clusterinformations.crd.projectcalico.org createdcustomresourcedefinition.apiextensions.k8s.io/felixconfigurations.crd.projectcalico.org createdcustomresourcedefinition.apiextensions.k8s.io/globalnetworkpolicies.crd.projectcalico.org createdcustomresourcedefinition.apiextensions.k8s.io/globalnetworksets.crd.projectcalico.org createdcustomresourcedefinition.apiextensions.k8s.io/hostendpoints.crd.projectcalico.org createdcustomresourcedefinition.apiextensions.k8s.io/ipamblocks.crd.projectcalico.org createdcustomresourcedefinition.apiextensions.k8s.io/ipamconfigs.crd.projectcalico.org createdcustomresourcedefinition.apiextensions.k8s.io/ipamhandles.crd.projectcalico.org createdcustomresourcedefinition.apiextensions.k8s.io/ippools.crd.projectcalico.org createdcustomresourcedefinition.apiextensions.k8s.io/ipreservations.crd.projectcalico.org createdcustomresourcedefinition.apiextensions.k8s.io/kubecontrollersconfigurations.crd.projectcalico.org createdcustomresourcedefinition.apiextensions.k8s.io/networkpolicies.crd.projectcalico.org createdcustomresourcedefinition.apiextensions.k8s.io/networksets.crd.projectcalico.org createdclusterrole.rbac.authorization.k8s.io/calico-kube-controllers createdclusterrole.rbac.authorization.k8s.io/calico-node createdclusterrolebinding.rbac.authorization.k8s.io/calico-kube-controllers createdclusterrolebinding.rbac.authorization.k8s.io/calico-node createddaemonset.apps/calico-node createddeployment.apps/calico-kube-controllers created
复制代码
等待一会以后,发现我们的节点状态变为了 Ready ,就OK了
  1. [root@k8s-master ~]# kubectl get nodes
  2. NAME         STATUS   ROLES           AGE   VERSIONk8s-master   Ready    control-plane   40m   v1.28.2k8s-node1    Ready    <none>          29m   v1.28.2k8s-node2    Ready    <none>          29m   v1.28.2
复制代码
  查看全部的 pod
  1. kubectl get pod -A
复制代码
  1. [root@k8s-master ~]# kubectl get pod -A
  2. NAMESPACE     NAME                                       READY   STATUS    RESTARTS   AGEkube-system   calico-kube-controllers-658d97c59c-wzj97   1/1     Running   0          9m18skube-system   calico-node-f76hr                          1/1     Running   0          2m10skube-system   calico-node-llncs                          1/1     Running   0          2mkube-system   calico-node-lwqjh                          1/1     Running   0          109skube-system   coredns-6554b8b87f-pbmbq                   1/1     Running   0          42mkube-system   coredns-6554b8b87f-pgrq2                   1/1     Running   0          42mkube-system   etcd-k8s-master                            1/1     Running   0          42mkube-system   kube-apiserver-k8s-master                  1/1     Running   0          42mkube-system   kube-controller-manager-k8s-master         1/1     Running   0          42mkube-system   kube-proxy-58b62                           1/1     Running   0          31mkube-system   kube-proxy-b6x29                           1/1     Running   0          42mkube-system   kube-proxy-jxct4                           1/1     Running   0          31mkube-system   kube-scheduler-k8s-master                  1/1     Running   0          42m
复制代码
测试 k8s 的自愈本领

我们将一个节点关机重启,reboot。
将 k8s-node2 关机:
  1. [root@k8s-node2 ~]# poweroff
  2. Connection closing...Socket close.
  3. Connection closed by foreign host.
  4. Disconnected from remote host(k8s-node2) at 17:02:36.
  5. Type `help' to learn how to use Xshell prompt.
复制代码
在 master 主机查看节点状态:
  1. [root@k8s-master ~]# kubectl get nodes
  2. NAME         STATUS     ROLES           AGE   VERSIONk8s-master   Ready      control-plane   49m   v1.28.2k8s-node1    Ready      <none>          37m   v1.28.2k8s-node2    NotReady   <none>          37m   v1.28.2
复制代码
发现 k8s-node2 已经是 NotReady 了,这时我们启动 k8s-node2 这台主机
等待一会,重新在 master 主机查看节点状态
  1. [root@k8s-master ~]# kubectl get nodes
  2. NAME         STATUS   ROLES           AGE   VERSIONk8s-master   Ready    control-plane   51m   v1.28.2k8s-node1    Ready    <none>          40m   v1.28.2k8s-node2    Ready    <none>          39m   v1.28.2
复制代码
发现 k8s-node2 又自动参加到集群了
k8s 的自愈本领非常强大,重要包括以下几个方面:


  • 自动重启:k8s 监控容器的状态,一旦发现容器瓦解或非常退出,会自动重启容器,确保应用持续可用。
  • 自动扩缩容:k8s 基于资源利用率和负载情况,可以自动扩展或缩减容器副本的数目,以满意应用步伐的需求。通过程度扩展和自动负载均衡,k8s可以动态调解容器副本的数目,提高应用步伐的可伸缩性和性能。
  • 自动容错和故障迁徙:k8s 提供了容器的健康检查机制,可以监控容器的状态,并在容器不健康或不可访问时自动将其从集群中删除,以制止影响其他容器的正常运行。同时,k8s 还支持故障迁徙,将故障容器重新部署到其他可用的节点上,以确保应用步伐的高可用性。
  • 自动滚动升级:k8s 支持滚动升级应用步伐,可以在不中断服务的情况下逐步更新容器版本。通过逐步替换容器副本,k8s 实现了应用步伐的平滑升级,低沉了升级过程中的风险。
  • 自动规复:k8s 可以监控节点的健康状态,一旦发现节点故障或不可访问,会自动将容器迁徙到其他可用节点上,实现容器的自动规复。
总的来说,k8s 具有自动管理和调度容器的本领,可以监控容器的状态、自动重启容器、自动扩缩容、自动容错和故障迁徙、自动滚动升级等,提供了强大的自愈本领,确保应用步伐的高可用性、可伸缩性和稳定性。
安装 k8s Dashboard 可视化界面

项目地址:https://github.com/kubernetes/dashboard
编辑文件recommended.yaml:
  1. apiVersion: v1
  2. kind: Namespace
  3. metadata:
  4.   name: kubernetes-dashboard
  5. ---
  6. apiVersion: v1
  7. kind: ServiceAccount
  8. metadata:
  9.   labels:
  10.     k8s-app: kubernetes-dashboard
  11.   name: kubernetes-dashboard
  12.   namespace: kubernetes-dashboard
  13. ---
  14. apiVersion: v1
  15. kind: ServiceAccount
  16. metadata:
  17.   name: dashboard-admin
  18.   namespace: kubernetes-dashboard
  19. ---
  20. kind: Service
  21. apiVersion: v1
  22. metadata:
  23.   labels:
  24.     k8s-app: kubernetes-dashboard
  25.   name: kubernetes-dashboard
  26.   namespace: kubernetes-dashboard
  27. spec:
  28.   type: NodePort
  29.   ports:
  30.     - port: 443
  31.       targetPort: 8443
  32.       nodePort: 31443
  33.   selector:
  34.     k8s-app: kubernetes-dashboard
  35. ---
  36. apiVersion: v1
  37. kind: Secret
  38. metadata:
  39.   labels:
  40.     k8s-app: kubernetes-dashboard
  41.   name: kubernetes-dashboard-certs
  42.   namespace: kubernetes-dashboard
  43. type: Opaque
  44. ---
  45. apiVersion: v1
  46. kind: Secret
  47. metadata:
  48.   labels:
  49.     k8s-app: kubernetes-dashboard
  50.   name: kubernetes-dashboard-csrf
  51.   namespace: kubernetes-dashboard
  52. type: Opaque
  53. data:
  54.   csrf: ""
  55. ---
  56. apiVersion: v1
  57. kind: Secret
  58. metadata:
  59.   labels:
  60.     k8s-app: kubernetes-dashboard
  61.   name: kubernetes-dashboard-key-holder
  62.   namespace: kubernetes-dashboard
  63. type: Opaque
  64. ---
  65. kind: ConfigMap
  66. apiVersion: v1
  67. metadata:
  68.   labels:
  69.     k8s-app: kubernetes-dashboard
  70.   name: kubernetes-dashboard-settings
  71.   namespace: kubernetes-dashboard
  72. ---
  73. kind: Role
  74. apiVersion: rbac.authorization.k8s.io/v1
  75. metadata:
  76.   labels:
  77.     k8s-app: kubernetes-dashboard
  78.   name: kubernetes-dashboard
  79.   namespace: kubernetes-dashboard
  80. rules:
  81.   - apiGroups: [""]
  82.     resources: ["secrets"]
  83.     resourceNames: ["kubernetes-dashboard-key-holder", "kubernetes-dashboard-certs", "kubernetes-dashboard-csrf"]
  84.     verbs: ["get", "update", "delete"]
  85.   - apiGroups: [""]
  86.     resources: ["configmaps"]
  87.     resourceNames: ["kubernetes-dashboard-settings"]
  88.     verbs: ["get", "update"]
  89.   - apiGroups: [""]
  90.     resources: ["services"]
  91.     resourceNames: ["heapster", "dashboard-metrics-scraper"]
  92.     verbs: ["proxy"]
  93.   - apiGroups: [""]
  94.     resources: ["services/proxy"]
  95.     resourceNames: ["heapster", "http:heapster:", "https:heapster:", "dashboard-metrics-scraper", "http:dashboard-metrics-scraper"]
  96.     verbs: ["get"]
  97. ---
  98. kind: ClusterRole
  99. apiVersion: rbac.authorization.k8s.io/v1
  100. metadata:
  101.   labels:
  102.     k8s-app: kubernetes-dashboard
  103.   name: kubernetes-dashboard
  104. rules:
  105.   - apiGroups: ["metrics.k8s.io"]
  106.     resources: ["pods", "nodes"]
  107.     verbs: ["get", "list", "watch"]
  108. ---
  109. apiVersion: rbac.authorization.k8s.io/v1
  110. kind: RoleBinding
  111. metadata:
  112.   labels:
  113.     k8s-app: kubernetes-dashboard
  114.   name: kubernetes-dashboard
  115.   namespace: kubernetes-dashboard
  116. roleRef:
  117.   apiGroup: rbac.authorization.k8s.io
  118.   kind: Role
  119.   name: kubernetes-dashboard
  120. subjects:
  121.   - kind: ServiceAccount
  122.     name: kubernetes-dashboard
  123.     namespace: kubernetes-dashboard
  124. ---
  125. apiVersion: rbac.authorization.k8s.io/v1
  126. kind: ClusterRoleBinding
  127. metadata:
  128.   name: kubernetes-dashboard
  129. roleRef:
  130.   apiGroup: rbac.authorization.k8s.io
  131.   kind: ClusterRole
  132.   name: kubernetes-dashboard
  133. subjects:
  134.   - kind: ServiceAccount
  135.     name: kubernetes-dashboard
  136.     namespace: kubernetes-dashboard
  137. ---
  138. apiVersion: rbac.authorization.k8s.io/v1
  139. kind: ClusterRoleBinding
  140. metadata:
  141.   name: dashboard-admin
  142. roleRef:
  143.   apiGroup: rbac.authorization.k8s.io
  144.   kind: ClusterRole
  145.   name: cluster-admin
  146. subjects:
  147. - kind: ServiceAccount
  148.   name: dashboard-admin
  149.   namespace: kubernetes-dashboard
  150. ---
  151. kind: Deployment
  152. apiVersion: apps/v1
  153. metadata:
  154.   labels:
  155.     k8s-app: kubernetes-dashboard
  156.   name: kubernetes-dashboard
  157.   namespace: kubernetes-dashboard
  158. spec:
  159.   replicas: 1
  160.   revisionHistoryLimit: 10
  161.   selector:
  162.     matchLabels:
  163.       k8s-app: kubernetes-dashboard
  164.   template:
  165.     metadata:
  166.       labels:
  167.         k8s-app: kubernetes-dashboard
  168.     spec:
  169.       containers:
  170.         - name: kubernetes-dashboard
  171.           image: kubernetesui/dashboard:v2.0.0-rc7
  172.           imagePullPolicy: Always
  173.           ports:
  174.             - containerPort: 8443
  175.               protocol: TCP
  176.           args:
  177.             - --auto-generate-certificates
  178.             - --namespace=kubernetes-dashboard
  179.           volumeMounts:
  180.             - name: kubernetes-dashboard-certs
  181.               mountPath: /certs
  182.             - mountPath: /tmp
  183.               name: tmp-volume
  184.           livenessProbe:
  185.             httpGet:
  186.               scheme: HTTPS
  187.               path: /
  188.               port: 8443
  189.             initialDelaySeconds: 30
  190.             timeoutSeconds: 30
  191.           securityContext:
  192.             allowPrivilegeEscalation: false
  193.             readOnlyRootFilesystem: true
  194.             runAsUser: 1001
  195.             runAsGroup: 2001
  196.       volumes:
  197.         - name: kubernetes-dashboard-certs
  198.           secret:
  199.             secretName: kubernetes-dashboard-certs
  200.         - name: tmp-volume
  201.           emptyDir: {}
  202.       serviceAccountName: kubernetes-dashboard
  203.       nodeSelector:
  204.         "beta.kubernetes.io/os": linux
  205.       tolerations:
  206.         - key: node-role.kubernetes.io/master
  207.           effect: NoSchedule
  208. ---
  209. kind: Service
  210. apiVersion: v1
  211. metadata:
  212.   labels:
  213.     k8s-app: dashboard-metrics-scraper
  214.   name: dashboard-metrics-scraper
  215.   namespace: kubernetes-dashboard
  216. spec:
  217.   ports:
  218.     - port: 8000
  219.       targetPort: 8000
  220.   selector:
  221.     k8s-app: dashboard-metrics-scraper
  222. ---
  223. kind: Deployment
  224. apiVersion: apps/v1
  225. metadata:
  226.   labels:
  227.     k8s-app: dashboard-metrics-scraper
  228.   name: dashboard-metrics-scraper
  229.   namespace: kubernetes-dashboard
  230. spec:
  231.   replicas: 1
  232.   revisionHistoryLimit: 10
  233.   selector:
  234.     matchLabels:
  235.       k8s-app: dashboard-metrics-scraper
  236.   template:
  237.     metadata:
  238.       labels:
  239.         k8s-app: dashboard-metrics-scraper
  240.       annotations:
  241.         seccomp.security.alpha.kubernetes.io/pod: 'runtime/default'
  242.     spec:
  243.       containers:
  244.         - name: dashboard-metrics-scraper
  245.           image: kubernetesui/metrics-scraper:v1.0.4
  246.           ports:
  247.             - containerPort: 8000
  248.               protocol: TCP
  249.           livenessProbe:
  250.             httpGet:
  251.               scheme: HTTP
  252.               path: /
  253.               port: 8000
  254.             initialDelaySeconds: 30
  255.             timeoutSeconds: 30
  256.           volumeMounts:
  257.           - mountPath: /tmp
  258.             name: tmp-volume
  259.           securityContext:
  260.             allowPrivilegeEscalation: false
  261.             readOnlyRootFilesystem: true
  262.             runAsUser: 1001
  263.             runAsGroup: 2001
  264.       serviceAccountName: kubernetes-dashboard
  265.       nodeSelector:
  266.         "beta.kubernetes.io/os": linux
  267.       tolerations:
  268.         - key: node-role.kubernetes.io/master
  269.           effect: NoSchedule
  270.       volumes:
  271.         - name: tmp-volume
  272.           emptyDir: {}
复制代码
编辑完成后实行应用:
  1. kubectl apply -f recommended.yaml
复制代码
实行完成后,查看全部 pod

看到这两个乐成启动即可
实行下面命令:
  1. # 当前默认命名空间下的服务 -A 全部命名空间下的服务
  2. kubectl get svc -A
复制代码
  1. [root@k8s-master ~]# kubectl get svc -A
  2. NAMESPACE              NAME                        TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                  AGE
  3. default                kubernetes                  ClusterIP   10.96.0.1       <none>        443/TCP                  70m
  4. kube-system            kube-dns                    ClusterIP   10.96.0.10      <none>        53/UDP,53/TCP,9153/TCP   70m
  5. kubernetes-dashboard   dashboard-metrics-scraper   ClusterIP   10.96.12.26     <none>        8000/TCP                 100s
  6. kubernetes-dashboard   kubernetes-dashboard        NodePort    10.96.157.187   <none>        443:31443/TCP            100s
复制代码
可以看到,访问端口是31443,协议是443,也就是 https
打开欣赏器,访问集群任意节点(ip 为3个服务器任意一个即可)即可以进入控制面板。
这里测试我们利用 chrome 欣赏器

由于欣赏器 chrome 利用 https 不安全,在这个页面凭空输入:thisisunsafe,即可进入

由于登录需要 token,接下来我们创建一个 token
编辑文件dash-token.yaml
  1. kind: ClusterRoleBinding
  2. apiVersion: rbac.authorization.k8s.io/v1
  3. metadata:
  4.   name: admin
  5.   annotations:
  6.     rbac.authorization.kubernetes.io/autoupdate: "true"
  7. roleRef:
  8.   kind: ClusterRole
  9.   name: cluster-admin
  10.   apiGroup: rbac.authorization.k8s.io
  11. subjects:
  12. - kind: ServiceAccount
  13.   name: admin
  14.   namespace: kubernetes-dashboard
  15. ---
  16. apiVersion: v1
  17. kind: ServiceAccount
  18. metadata:
  19.   name: admin
  20.   namespace: kubernetes-dashboard
  21.   labels:
  22.     kubernetes.io/cluster-service: "true"
  23.     addonmanager.kubernetes.io/mode: Reconcile
复制代码
实行应用这个文件,获取令牌:
  1. kubectl apply -f dash-token.yaml
  2. kubectl create token admin  --namespace kubernetes-dashboard
复制代码
  1. [root@k8s-master ~]# kubectl apply -f dash-token.yaml
  2. clusterrolebinding.rbac.authorization.k8s.io/admin created
  3. serviceaccount/admin created
  4. [root@k8s-master ~]# kubectl create token admin  --namespace kubernetes-dashboard
  5. eyJhbGciOiJSUzI1NiIsImtpZCI6IkV6MDJ6S1NSMDlvTmJKRGc4WWJ5RUk1aW5MOUxRMUFmNFk3M1BMWmVGWTQifQ.eyJhdWQiOlsiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWwiXSwiZXhwIjoxNzExMjc2MzY5LCJpYXQiOjE3MTEyNzI3NjksImlzcyI6Imh0dHBzOi8va3ViZXJuZXRlcy5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsIiwia3ViZXJuZXRlcy5pbyI6eyJuYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsInNlcnZpY2VhY2NvdW50Ijp7Im5hbWUiOiJhZG1pbiIsInVpZCI6ImY4NjNhZjk5LTczMWEtNDlkZi04ODhhLWU3MDBlMGNhZWQ2OSJ9fSwibmJmIjoxNzExMjcyNzY5LCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZXJuZXRlcy1kYXNoYm9hcmQ6YWRtaW4ifQ.CwVQxLVq6fKRacovFHCQat20Xz-M1OjLCZnKM_ERHa87UchqD6aRYSoZG-oFvW2TVGLvRIwa3ViNNVMWtFMEUwy0Zzg_nM6SdqWc-fvvfWLabA_Deqi0gANlcCcUW6lLlm37iQ9nUrsfRK6LLFlow9J_wkOnB6ZmzSQcNltEbBk5SL4-Zf0goOdycLI79p8xFM26TVg5U-2eILCGBLnVAUMHpADBvkmaKSR3ix1VLFk2g6aPV89ySmt4dTwuXS--bEGW7EY1hF3-8Z_c93x9yP7p7sgdvzKYcwTmeE4ML8M3VGVoK_Nnv5-MBmyDFfDoRSaUdtJBcLiIEUXzkJuhBQ
复制代码
拿到 token 去登录即可

可以在 dashboard 界面查看自己 k8s 集群的全部信息

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

慢吞云雾缓吐愁

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表