搭建k8s集群之kubeadm方式

一、环境准备

  使用Hyper-V虚拟机功能搭建三台Centos虚拟机系统,配置好静态IP,分别为k8s-node1(192.168.0.8),k8s-node2(192.168.0.9),k8s-node3(192.168.0.10)。系统安装成功后配置root远程登录功能,以便使用ssh客户端工具链接。

  初始化系统设置:

    ◉配置虚拟机的MAC地址,确保MAC地址和 product_uuid 对于每个节点都是唯一的。可以通过如下命令来查看他们是否唯一:

 ip link
 cat /sys/class/dmi/id/product_uuid

    ◉分配固定IP :在虚拟机中配置静态IP,首先找到需要配置静态IP的网卡配置文件,我的是eth1,因此修改/etc/sysconfig/network-scripts/ifcfg-eth1文件,设置如下箭头指示的内容:

    ◉更新yum源:运行命令"  yum update "更新yum源。

    ◉开启SSH远程登录:运行命令"  yum install openssh-server "安装ssh服务端工具,安装完成后运行命令" systemctl enable sshd.service "设置开启自启动, 运行命令" vim /etc/ssh/sshd_config "编辑配置文件,设置如下:

    ◉修改IPV6为IPV4:centos默认使用ipv6的方式,我们需要修改为ipv4模式来实现ssh客户端的远程连接,具体方法是 cd到 /etc/sysconfig/network-scripts目录下,vim 编辑 ifcfg-eth1 文件,如图,设置IPV6INIT=no,ONBOOT=yes。

    ◉设置防火墙规则:设置防火墙规则的目的是为了确保集群中的机器能够相互通信,本次集群直接使用命令" systemctl disable firewalld "关闭防火墙。在正式环境中,防火墙不可能禁用,因此需要开放如下端口:

 

开放指定端口的命令格式为:

firewall-cmd --zone=public  --add-port=6443/tcp --permanent

    ◉同步系统时间:K8s要求集群中的节点时间必须精确一致,所以在每个节点上同步时间:

yum install ntpdate -y
ntpdate time.windows.com

    ◉设置让iptables 看到桥接的流量,确保net.bridge.bridge-nf-call-iptables在您的配置中设置为 1,运行如下代码:

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sudo sysctl --system

    ◉配置主机名映射,修改/etc/hosts文件(一般在集群中的每个节点都做该处理),运行如下命令:

cat >> /etc/hosts << EOF
192.168.0.8 k8s-node1
192.168.0.9 k8s-node2
192.168.0.10 k8s-node3
EOF

    ◉关闭Linux系统的交换分区:为了保证kubelet的正常运行,必须禁用swap交换分区。window平台上称为虚拟内存。在物理内存不够用时,操作系统会从物理内存中把部分暂时不被使用的数据转移到交换分区,从而为当前运行的程序留出足够的物理内存。运行命令" free -m "结果证明已经开启了交换分区,修改/etc/fstab文件,注释掉加载swap分区的这行记录,重启Linux系统即可。

二、安装K8S容器运行时

  为了实现k8s与容器运行时的解耦,k8sV1.5以后推出了容器运行时接口CRI的概念,只要实现了该接口的任何容器运行时都可以与k8s结合使用完成集群部署,容器运行时负责启动、停止和运行容器。v1.24 之前的 Kubernetes 版本集成了docker engine,使用名为dockershim的容器运行时组件,在V1.24版本后就不在集成,因此,此版本后的集群搭建,需要手动安装容器运行时,常见的容器运行时有containerd、cri-o、docker engine、Mirantis Container Runtime。安装过程如下:

  ◉使用containerd作为运行时(官方推荐):

    1、安装和配置先决条件,依次运行如下命令:

cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

# Setup required sysctl params, these persist across reboots.
cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables  = 1
net.ipv4.ip_forward                 = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF

# Apply sysctl params without reboot
sudo sysctl --system

     2、安装containerd容器及相关组件,依次运行如下命令:

#安装需要的软件包, yum-util 提供yum-config-manager功能
yum install -y yum-utils 

#设置yum源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

#安装containerd
yum install containerd -y

#复制替换默认config.toml内容
containerd config default > /etc/containerd/config.toml

#重启、开机启动containerd
systemctl start containerd
systemctl daemon-reload
systemctl enable containerd

    3、编辑 /etc/containerd/config.toml,修改 containerd 默认的sandbox_image ,修改sandbox_image的值为如下:

sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.7"

  ◉配置 cgroup 驱动程序(可选):容器运行时和 kubelet 都有一个名为 “cgroupDriver”的属性,需要保证它们的属性值一致,否则kubelet进程无法正常运行。容器运行时的cgroupDriver属性根据不同的组件配置方式有所不同,而kubelet的cgroupDriver属性可以通过kubeadm指定,其方式如下(如果没有使用配置文件方式指定,则默认值为systemd):

# kubeadm-config.yaml文件的内容
kind: ClusterConfiguration
apiVersion: kubeadm.k8s.io/v1beta3
kubernetesVersion: v1.21.0
---
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
cgroupDriver: systemd
kubeadm init --config kubeadm-config.yaml  #在init时指定配置文件 kubeadm-config.yaml

三、安装POD网络插件

  这一步骤在V1.24之前的版本中可以在执行了kubeadm init之后根据提示来安装,但是本人在本次实验中如果没有先安装POD网络插件,则在执行命令kubeadm init 时会卡在如下这一步:

查阅日志发现kubelet报如下错误,大致意思是无法访问到https://k8s-node3:6443/api/v1/services地址。

因此,在使用kubeadm init之前,先安装POD网络插件,使用如下命令安装一个名为calico的插件:插件的yaml文件下载地址calico.yaml,下载完成后上传到虚拟机中切换到calico文件所在目录,运行如下命令:

kubectl apply -f calico.yaml

安装界面如下:

四、安装K8S集群

  完成以上步骤后,就可以进行k8s组件的安装了,我们需要三个必须的组件kubeadm、kubelet 和 kubectl,把他们安装到每台集群的机器上。其中kubeadm是引导我们创建集群的命令;kubelet 是集群中的所有机器上运行的组件,并执行诸如启动 pod 和容器之类的操作;kubectl是与集群对话的命令行工具。读者请注意,kubeadm不会为你安装或管理kubelet和kubectl,因此你需要确保它们与control plane之间版本的匹配,如果不这样做,则存在版本偏差的风险,这可能导致意外的错误行为。

  安装步骤:

  1、配置k8s下载地址信息(配置为阿里云镜像,国外镜像很难下载成功),运行如下命令。

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl
EOF

  2、运行如下命令安装三个组件。

yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

  3、设置kubelet的开机自启动:启动后kubelet会每隔几秒启动一次来探测kubeadm的命令。

  systemctl enable kubelet && systemctl start kubelet

  4、提前准备k8s集群必须的组件:在后续的kubeadm init命令中,需要下载一些必须镜像,这些镜像可以通过 " kubeadm config images list "命令来查看,如图:

  但是这些镜像默认是从国外源(也可通过参数指定国内镜像源 --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \ ),在国内无法下载,因此有必要在此之前先使用国内源下载好这些镜像,此处使用阿里云镜像地址下载:

docker pull  registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.24.0
docker pull  registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.24.0
docker pull  registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.24.0
docker pull  registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.24.0
docker pull  registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:v1.8.6
docker pull  registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.3-0
docker pull  registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.7

根据上面的命令把镜像都下载完成后,进行镜像复制,调用 "  docker tag  oldimages newimages "命令复制出满足kubeadm init的标准镜像,代码如下:

docker tag  registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.24.0          k8s.gcr.io/kube-apiserver:v1.24.0 
docker tag  registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.24.0              k8s.gcr.io/kube-proxy:v1.24.0 
docker tag  registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.24.0 k8s.gcr.io/kube-controller-manager:v1.24.0
docker tag  registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.24.0          k8s.gcr.io/kube-scheduler:v1.24.0
docker tag  registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:v1.8.6                  k8s.gcr.io/coredns/coredns:v1.8.6
docker tag  registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.3-0                    k8s.gcr.io/etcd:3.5.3-0
docker tag  registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.7                       k8s.gcr.io/pause:3.7

执行完成所有复制命令后,docker images查看镜像,发现需要的镜像已准备好,列表如下:

 

  5、使用kubeadm来引导我们创建集群。首先运行 " kubeadm init  [arg]"命令,会进行一系列预检查以确保机器已准备好运行 Kubernetes。这些预检查会显示警告并在错误时退出(参考本人另一篇文章k8s集群常见错误及处理方法)。然后下载并安装集群控制平面组件。 kubeadm init 包含一些指定参数,可通过" kubeadm init  --help " 帮助文档查看说明,其参数说明下:

      --apiserver-advertise-address string   设置 apiserver 绑定的 IP. 即一般为master节点的IP
      --apiserver-bind-port int32            设置apiserver 监听的端口. (默认 6443)
      --control-plane-endpoint string        设置控制平面的端点(matser控制节点的IP或域名)
      --apiserver-cert-extra-sans strings    api证书中指定额外的Subject Alternative Names (SANs) 可以是IP 也可以是DNS名称。 证书是和SAN绑定的。
      --cert-dir string                      证书存放的目录 (默认 "/etc/kubernetes/pki")
      --certificate-key string               kubeadm-cert secret 中 用于加密 control-plane 证书的key
      --config string                        kubeadm 配置文件的路径.
      --cri-socket string                    CRI socket 文件路径,如果为空 kubeadm 将自动发现相关的socket文件; 只有当机器中存在多个 CRI  socket 或者 存在非标准 CRI socket 时才指定.
      --dry-run                              测试,并不真正执行;输出运行后的结果.
      --feature-gates string                 指定启用哪些额外的feature 使用 key=value 对的形式。
      --help  -h                             帮助文档
      --ignore-preflight-errors strings      忽略前置检查错误,被忽略的错误将被显示为警告. 例子: 'IsPrivilegedUser,Swap'. Value 'all' ignores errors from all checks.
      --image-repository string              选择拉取 control plane images 的镜像repo (default "k8s.gcr.io") ,国内一般无法直接从k8s.gcr.io获取,需要改为国内的代理地址
      --kubernetes-version string            选择K8S版本. (default "stable-1")
      --node-name string                     指定node的名称,默认使用 node 的 hostname.
      --pod-network-cidr string              指定 pod 的网络, control plane 会自动将 网络发布到其他节点的node,让其上启动的容器使用此网络
      --service-cidr string                  指定service 的IP 范围. (default "10.96.0.0/12"),不能与机器的IP段有重叠
      --service-dns-domain string            指定 service 的 dns 后缀, e.g. "myorg.internal". (default "cluster.local")
      --skip-certificate-key-print            不打印 control-plane 用于加密证书的key.
      --skip-phases strings                  跳过指定的阶段(phase)
      --skip-token-print                     不打印 kubeadm init 生成的 default bootstrap token 
      --token string                         指定 node 和control plane 之间,简历双向认证的token ,格式为 [a-z0-9]{6}\.[a-z0-9]{16} - e.g. abcdef.0123456789abcdef
      --token-ttl duration                   token 自动删除的时间间隔。 (e.g. 1s, 2m, 3h). 如果设置为 '0', token 永不过期 (default 24h0m0s)
      --upload-certs                         上传 control-plane 证书到 kubeadm-certs Secret.

本方案我们使用如下命令参数来初始化主控节点:

kubeadm  init    \
--apiserver-advertise-address 192.168.0.10  \
--image-repository registry.cn-hangzhou.aliyuncs.com/google_containers  \
--control-plane-endpoint k8s-node3  \
--service-cidr  10.96.0.0/16  \
--pod-network-cidr 192.168.0.0/16

这可能会需要几分钟来完成组件的安装,安装成功后应该看到类似如下的输出:

 

 屏幕输出中提示:

  ◉你的Kubernetes控制平面已成功初始化。

  ◉要开始使用群集,您需要以普通用户身份运行以下操作:

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

或者如果你是root用户,可以运行:

  export KUBECONFIG=/etc/kubernetes/admin.conf

  ◉您应该在集群上部署一个pod网络,使用下列选项之一运行kubectl apply -f [podnetwork].yaml:

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

选项提供了一个地址,这个地址包含了很多的网络插件,此处本人使用Calico插件,如前一步没有安装,请参照前面讲到的安装POD网络插件部分。等待一段时间使用 "  kubectl get nodes  "查看节点状态,节点将由NotReady-->Ready。

  ◉通过在每个节点上复制证书颁发机构和服务帐户密钥,然后以root用户身份运行以下操作,可以加入任意数量的控制平面节点:

  kubeadm join k8s-node3:6443 --token kwvjsf.sui8de3bfiek4j4n \
        --discovery-token-ca-cert-hash sha256:a8566a5cc5b99b453e860f4d05dc681321911e23fc495d6b108127604d2484a6 \
        --control-plane 

  ◉通过root用户身份在每个节点上运行以下操作,可以加入任意数量的工作节点:

kubeadm join k8s-node3:6443 --token kwvjsf.sui8de3bfiek4j4n \
        --discovery-token-ca-cert-hash sha256:a8566a5cc5b99b453e860f4d05dc681321911e23fc495d6b108127604d2484a6 

 根据这些提示完成提示操作后,集群环境就搭建完成了,init成功后的这些提示建议保存,方便后续增加主节点和工作节点。最终查看集群状态结果如下:

 

四、集群节点的维护

  集群搭建成功后,后期通常需要对集群节点进行增删改查,或者改变节点的角色。节点维护常用的命令如下:

#查看集群节点的状态
kubectl get nodes 

#在master节点中运行如下命令可以打印出加入该集群的命令(这个命令在要加入的节点上运行)
kubeadm token create --print-join-command

#删除集群节点命令
kubectl delete node k8s-nodename

#如果集群节点删除后需要再次加入,则需要使用 kubeadm reset 重置
kubeadm reset

#获取节点证书certificate-key的命令
kubeadm init phase upload-certs --upload-certs

   ◉加入普通节点,直接运行以上打印出的节点加入命令:

kubeadm join k8s-node3:6443 \
--token t5nd9g.d01xp23hdtgko37g \
--discovery-token-ca-cert-hash sha256:25df98ca8636d20b407934e0145a61fff15304437be517b16bcea6ac754d972a   

  ◉加入控制节点,首先在master节点上获取服务帐户密钥:

然后再运行如下命令(与加入普通节点的区别是增加了后面2个参数):

kubeadm join k8s-node3:6443 \
--token t5nd9g.d01xp23hdtgko37g \
--discovery-token-ca-cert-hash sha256:25df98ca8636d20b407934e0145a61fff15304437be517b16bcea6ac754d972a   \
--control-plane \
--certificate-key  d5d6d1d58d0b3e6d1e3fcdf37b91a09627d7d221cf19c5c0881b9bd1c10df69f

五、k8s集群搭建可视化界面Dashboard

  Dashboard 是基于网页的 Kubernetes 用户界面。 可以使用 Dashboard 将容器应用部署到 Kubernetes 集群中,也可以对容器应用排错,还能管理集群资源,使用 Dashboard 获取运行在集群中的应用的概览信息,也可以创建或者修改 Kubernetes 资源。默认情况下不会部署 Dashboard。

  1、使用如下命令部署Dashboard:

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.5.0/aio/deploy/recommended.yaml

 该方式无法进行个性化配置,建议将recommended.yaml文件下载到机器上使用 " kubectl apply -f  recommended.yaml "部署,在recommended.yaml文件中设置:

 

以上个性化配置的目的:

  ◉设置Service网络为NodePort,确保能通过任意一台集群机器+nodePort指定的端口访问kubernetes-dashboard。

  ◉设置镜像拉取策略为本地存在时不再联网下载。

  ◉设置亲和性节点,强制将kubernetes-dashboard安装到master所在的节点,因为默认情况下kubernetes-dashboard部署到非master节点会出现权限问题导致无法访问。

最后内容如下:

# Copyright 2017 The Kubernetes Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

apiVersion: v1
kind: Namespace
metadata:
  name: kubernetes-dashboard

---

apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard

---

kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
spec:
  type: NodePort
  ports:
    - port: 443
      nodePort: 30000 
      targetPort: 8443
  selector:
    k8s-app: kubernetes-dashboard

---

apiVersion: v1
kind: Secret
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard-certs
  namespace: kubernetes-dashboard
type: Opaque

---

apiVersion: v1
kind: Secret
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard-csrf
  namespace: kubernetes-dashboard
type: Opaque
data:
  csrf: ""

---

apiVersion: v1
kind: Secret
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard-key-holder
  namespace: kubernetes-dashboard
type: Opaque

---

kind: ConfigMap
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard-settings
  namespace: kubernetes-dashboard

---

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
rules:
  # Allow Dashboard to get, update and delete Dashboard exclusive secrets.
  - apiGroups: [""]
    resources: ["secrets"]
    resourceNames: ["kubernetes-dashboard-key-holder", "kubernetes-dashboard-certs", "kubernetes-dashboard-csrf"]
    verbs: ["get", "update", "delete"]
    # Allow Dashboard to get and update 'kubernetes-dashboard-settings' config map.
  - apiGroups: [""]
    resources: ["configmaps"]
    resourceNames: ["kubernetes-dashboard-settings"]
    verbs: ["get", "update"]
    # Allow Dashboard to get metrics.
  - apiGroups: [""]
    resources: ["services"]
    resourceNames: ["heapster", "dashboard-metrics-scraper"]
    verbs: ["proxy"]
  - apiGroups: [""]
    resources: ["services/proxy"]
    resourceNames: ["heapster", "http:heapster:", "https:heapster:", "dashboard-metrics-scraper", "http:dashboard-metrics-scraper"]
    verbs: ["get"]

---

kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
rules:
  # Allow Metrics Scraper to get metrics from the Metrics server
  - apiGroups: ["metrics.k8s.io"]
    resources: ["pods", "nodes"]
    verbs: ["get", "list", "watch"]

---

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: kubernetes-dashboard
subjects:
  - kind: ServiceAccount
    name: kubernetes-dashboard
    namespace: kubernetes-dashboard

---

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: kubernetes-dashboard
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: kubernetes-dashboard
subjects:
  - kind: ServiceAccount
    name: kubernetes-dashboard
    namespace: kubernetes-dashboard

---

kind: Deployment
apiVersion: apps/v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
spec:
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      k8s-app: kubernetes-dashboard
  template:
    metadata:
      labels:
        k8s-app: kubernetes-dashboard
    spec:
      securityContext:
        seccompProfile:
          type: RuntimeDefault
      nodeName: k8s-node3
      containers:
        - name: kubernetes-dashboard
          image: kubernetesui/dashboard:v2.5.0
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 8443
              protocol: TCP
          args:
            - --auto-generate-certificates
            - --namespace=kubernetes-dashboard
            # Uncomment the following line to manually specify Kubernetes API server Host
            # If not specified, Dashboard will attempt to auto discover the API server and connect
            # to it. Uncomment only if the default does not work.
            # - --apiserver-host=http://my-address:port
          volumeMounts:
            - name: kubernetes-dashboard-certs
              mountPath: /certs
              # Create on-disk volume to store exec logs
            - mountPath: /tmp
              name: tmp-volume
          livenessProbe:
            httpGet:
              scheme: HTTPS
              path: /
              port: 8443
            initialDelaySeconds: 30
            timeoutSeconds: 30
          securityContext:
            allowPrivilegeEscalation: false
            readOnlyRootFilesystem: true
            runAsUser: 1001
            runAsGroup: 2001
      volumes:
        - name: kubernetes-dashboard-certs
          secret:
            secretName: kubernetes-dashboard-certs
        - name: tmp-volume
          emptyDir: {}
      serviceAccountName: kubernetes-dashboard
      nodeSelector:
        "kubernetes.io/os": linux
      # Comment the following tolerations if Dashboard must not be deployed on master
      #tolerations:
        #- key: node-role.kubernetes.io/master
         # effect: NoSchedule

---

kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: dashboard-metrics-scraper
  name: dashboard-metrics-scraper
  namespace: kubernetes-dashboard
spec:
  ports:
    - port: 8000
      targetPort: 8000
  selector:
    k8s-app: dashboard-metrics-scraper

---

kind: Deployment
apiVersion: apps/v1
metadata:
  labels:
    k8s-app: dashboard-metrics-scraper
  name: dashboard-metrics-scraper
  namespace: kubernetes-dashboard
spec:
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      k8s-app: dashboard-metrics-scraper
  template:
    metadata:
      labels:
        k8s-app: dashboard-metrics-scraper
    spec:
      securityContext:
        seccompProfile:
          type: RuntimeDefault
      nodeName: k8s-node3
      containers:
        - name: dashboard-metrics-scraper
          image: kubernetesui/metrics-scraper:v1.0.7
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 8000
              protocol: TCP
          livenessProbe:
            httpGet:
              scheme: HTTP
              path: /
              port: 8000
            initialDelaySeconds: 30
            timeoutSeconds: 30
          volumeMounts:
          - mountPath: /tmp
            name: tmp-volume
          securityContext:
            allowPrivilegeEscalation: false
            readOnlyRootFilesystem: true
            runAsUser: 1001
            runAsGroup: 2001
      serviceAccountName: kubernetes-dashboard
      nodeSelector:
        "kubernetes.io/os": linux
      # Comment the following tolerations if Dashboard must not be deployed on master
      #tolerations:
      #  - key: node-role.kubernetes.io/master
      #    effect: NoSchedule
      volumes:
        - name: tmp-volume
          emptyDir: {}

创建过程如图所示:

  2、查看Dashboard的运行状态,使用命令" kubectl get pod -A "查看得如下结果,此时需要等待状态变为Running。

  3、修改访问模式:运行命令" kubectl get svc -A |grep kubernetes-dashboard "查看端口,结果如下。

ClusterIP为集群内部网络访问方式,需要修改成NodePort,来支持集群主机访问的方式,运行如下命令来修改资源配置:

kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard

 

 再次运行命令" kubectl get svc -A |grep kubernetes-dashboard "查看端口,结果如下,多了一个映射端口30704,我们就可以通过任意一台集群机器的IP+30704端口就能访问该资源。

  4、访问https://192.168.0.10:30704,发现无法打开页面,再次运行 "  kubectl get pod -A "却发现Running状态变成了CrashLoopBackOff,如图:

 

 运行命令 "   kubectl describe pod  kubernetes-dashboard-6cdd697d84-kcz6p  -n kubernetes-dashboard "查看POD日志,发现如下警告:

 

 原因是kubernetes-dashboard  POD被默认安装到了非master节点,产生了权限不足的问题,需要按照前面提到的个性化yaml配置重新部署,步骤如下:

  ◉删除已经安装的POD:

 kubectl delete Deployment kubernetes-dashboard -n kubernetes-dashboard
 kubectl delete Deployment dashboard-metrics-scraper -n kubernetes-dashboard

  ◉重新通过修改后的recommended.yaml文件创建POD:

 kubectl apply -f  recommended.yaml

折腾到这里,kubernetes-dashboard面板已创建完成,访问https://192.168.0.10:30000,显示界面如下:

如果开启账号密码登录,则界面如下:

posted @ 2022-04-30 15:47  我若安好,便是晴天  阅读(1489)  评论(3编辑  收藏  举报