• 从零开始搭建高可用的k8s集群


    一、环境准备

      使用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,显示界面如下:

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

     六、k8s可视化界面Dashboard的登录认证方式详解

      待续.......

     七、使用Dashboard界面方式部署一套完整的微服务项目

      待续.......

    八、使用kubectl命令行工具部署一套完整的微服务项目

      待续.......

  • 相关阅读:
    redis总结
    java程序启动脚本
    mysql生成百万测试数据脚本
    java分布式锁的实现及在springboot中的应用
    mysql使用总结
    一个java实现代码(服务)编排的思路(未完)
    sentinel自定义统一限流降级处理
    shell学习
    oracle查看被锁的事务进程sql
    Sql查询两个时间段有重叠的记录
  • 原文地址:https://www.cnblogs.com/zqhIndex/p/16200734.html
Copyright © 2020-2023  润新知