Kubernetes

一、Kubernetes简介

1.1 kubernetes简介

kubernetes,简称K8s,是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes 的目标是让部署容器化的应用简单并且高效(powerful), 能够进行应用的自动化部署和扩缩容。Kubernetes 提供了应用部署,规划,更新,维护的一种机制。

传统的应用部署方式是通过插件或脚本来安装应用。这样做的缺点是应用的运行、配置、管理、所有生存周期将与当前操作系统绑定,这样做并不利于应用的升级更新/回滚等操作,当然也可以通过创建虚拟机的方式来实现某些功能,但是虚拟机非常重,并不利于可移植性。

新的方式是通过部署容器方式实现,每个容器之间互相隔离,每个容器有自己的文件系统,容器之间进程不会相互影响,能区分计算资源。相对于虚拟机,容器能快速部署,由于容器与底层设施、机器文件系统解耦的。
Kubernetes 积累了作为Google 生产环境运行工作负载15 年的经验,并吸收了来自于社区的最佳想法和实践。

  • K8s是谷歌在2014年发布的容器化集群管理系统
  • 使用k8s进行容器化应用部署
  • 使用k8s利于应用扩展
  • k8s目标实施让部署容器化应用更加简洁和高效

1.2 kubernetes发展历程

我们的项目部署经历了下面的这样一个历程

传统部署 -> 虚拟化部署时代 -> 容器部署时代

在这里插入图片描述

  • 传统部署时代:早期,组织在物理服务器上运行应用程序。无法为物理服务器中的应用程序定义资源边界,这会导致资源分配问题。例如,如果在物理服务器上运行多个应用程序,则可能会出现-一个应用程序占用大部分资源的情况,结果可能导致其他应用程序的性能下降。–种解决方案是在不同的物理服务器上运行每个应用程序,但是由于资源利用不足而无法扩展,并且组织维护许多物理服务器的成本很高。
  • 虚拟化部署时代:作为解决方案,引入了虚拟化功能,它允许您在单个物理服务器的CPU.上运行多个虚拟机(VM)。虚拟化功能允许应用程序在VM之间隔离,并提供安全级别,因为一个应用程序的信息不能被另一应用程序自由地访问。因为虚拟化可以轻松地添加或更新应用程序、降低硬件成本等等,所以虚拟化可以更好地利用物理服务器中的资源,并可以实现更好的可伸缩性。每个VM是一台完整的计算机,在虚拟化硬件之上运行所有组件,包括其自己的操作系统。
  • 容器部署时代:容器类似于VM,但是它们具有轻量级的隔离属性,可以在应用程序之间共享操作系统 (OS),因此,容器被认为是轻量级的。容器与VM类似,具有自己的文件系统、CPU、内存、进程空间等。由于它们与基础架构分离,因此可以跨云和OS分发进行移植。

容器因具有许多优势而变得流行起来。下面列出了容器的一些好处:

  • 敏捷应用程序的创建和部署:与使用VM镜像相比,提高了容器镜像创建的简便性和效率。
  • 持续开发、集成和部署:通过简单的回滚(由于镜像不可变性),提供可靠且频繁的容器镜像构建和部署。
  • 关注开发与运维的分离:在构建/时而不是在部署时创建应用程序容器镜像,将应用程序与基础架构分离。
  • 可观察性:不仅可以显示操作系统级别的信息和指标,还可以显示应用程序的运行状况和其他指标信号。
  • 跨开发、测试和生产的环境一致性:在便携式计算机上与在云中相同地运行。
  • 云和操作系统分发的可移植性:可在Ubuntu、RHEL、RHEL、CoreOS、本地、Google Kubernetes Engine和其它任何其它地方运行。
  • 以应用程序为中心的管理:提高抽象级别,从在虚拟硬件上运行OS到使用逻辑资源在OS上运行应用程序。
  • 松散耦合、分布式、弹性、解放的微服务:应用程序被分解成较小的独立部分,并且可以动态部署和管理-而不是在一台大型单机上器体运行。
  • 资源隔离:可预测的应用程序性能。

1.3 k8s核心功能

自动装箱

基于容器对应用运行环境的资源配置要求自动部署应用容器

自我修复(自愈能力)

当容器失败时,会对容器进行重启

当所部署的Node节点有问题时,会对容器进行重新部署和重新调度

当容器未通过监控检查时,会关闭此容器直到容器正常运行时,才会对外提供服务

水平扩展

通过简单的命令、用户UI 界面或基于CPU 等资源使用情况,对应用容器进行规模扩大或规模剪裁
当我们有大量的请求来临时,我们可以增加副本数量,从而达到水平扩展的效果

服务发现

用户不需使用额外的服务发现机制,就能够基于Kubernetes 自身能力实现服务发现和负载均衡

滚动更新

可以根据应用的变化,对应用容器运行的应用,进行一次性或批量式更新
添加应用的时候,不是加进去就马上可以进行使用,而是需要判断这个添加进去的应用是否能够正常使用

版本回退

可以根据应用部署情况,对应用容器运行的应用,进行历史版本即时回退
类似于Git中的回滚

密钥和配置管理

在不需要重新构建镜像的情况下,可以部署和更新密钥和应用配置,类似热部署。

存储编排

自动实现存储系统挂载及应用,特别对有状态应用实现数据持久化非常重要
存储系统可以来自于本地目录、网络存储(NFS、Gluster、Ceph 等)、公共云存储服务

批处理

提供一次性任务,定时任务;满足批量数据处理和分析的场景

二、k8s架构组件

在这里插入图片描述在这里插入图片描述
Kubernetes属于典型的Server-Client形式的二层架构
k8s主要包含两部分,Master主节点和Node工作节点

2.1 Master节点

Master主要由API Server、Controller-Manager和Scheduler三个组件,以及一个用于集群状态存储的Etcd存储服务组成,它们构成整个集群的控制平面

  • kube-apiserver:所有服务访问统一入口
    • 整个集群的API网关,相关应用程序为kube-apiserver
    • 基于http/https协议以REST风格提供,几乎所有功能全部抽象为“资源”及相关的“对象”
    • 声明式API,用于只需要声明对象的“终态”,具体的业务逻辑由各资源相关的Controller负责完成
    • 无状态,数据存储于etcd中
  • CrontrollerManager:维持副本期望数目
    • 负责实现客户端通过API提交的终态声明,相应应用程序为kube-controller-manager
    • 由相关代码通过一系列步骤驱动API对象的“实际状态”接近或等同“期望状态”
  • Scheduler::负责调度任务,选择合适的节点进行分配任务
    • 调度器,负责为Pod挑选出(评估这一刻)最合适的运行节点
    • 相关程序为kube-scheduler
  • ETCD:键值对数据库 储存K8S集群所有重要信息(持久化),协助分布式集群的正常运转。
    • 集群状态数据存储系统,通常指的就是etcd
    • 仅会同API Server交互

2.2 Node节点

每个Node节点则主要包含Kubelet、Kube Proxy及容器运行时(docker是最为常用的实现)三个组件,它们承载运行各类应用容器

  • Kubelet:Kubernetes集群于每个Worker节点上的代理,直接跟容器引擎交互实现容器的生命周期管理
    • 接收并执行Master发来的指令,管理由Scheduler绑定至当前节点上的Pod对象的容器
    • 通过API Server接收Pod资源定义,或从节点本地目录中加载静态Pod配置
    • 借助于兼容CRI的容器运行时管理和监控Pod相关的容器
  • Kube-proxy:负责写入规则至 IPTABLES、IPVS 实现服务映射访问的
    • ptables模式:将Service资源的定义转为适配当前节点视角的iptables规则
    • ipvs模式:将Service资源的定义转为适配当前节点视角的ipvs和少量iptables规则
    • 是打通Pod网络在Service网络的关键所在
  • COREDNS:可以为集群中的SVC创建一个域名IP的对应关系解析
  • DASHBOARD:给 K8S 集群提供一个 B/S 结构访问体系
  • INGRESS CONTROLLER:官方只能实现四层代理,INGRESS 可以实现七层代理
  • FEDERATION:提供一个可以跨集群中心多K8S统一管理功能
  • PROMETHEUS:提供K8S集群的监控能力
  • ELK:提供 K8S 集群日志统一分析介入平台

三、k8s集群搭建

主要有两种方式搭建,第一种是kubeadm工具搭建,第二种是通过二进制方式搭建

3.1 使用kubeadm方式搭建K8S集群

kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具。
这个工具能通过两条指令完成一个kubernetes集群的部署:

# 创建一个 Master 节点
kubeadm init

# 将一个 Node 节点加入到当前集群中
kubeadm join <Master节点的IP和端口 >

使用kubeadm方式搭建K8s集群主要分为以下几步

  • 准备三台虚拟机,同时安装操作系统CentOS 7.x
  • 对三个安装之后的操作系统进行初始化操作
  • 在三个节点安装 docker kubelet kubeadm kubectl
  • 在master节点执行kubeadm init命令初始化
  • 在node节点上执行 kubeadm join命令,把node节点添加到当前集群
  • 配置CNI网络插件,用于节点之间的连通【失败了可以多试几次】
  • 通过拉取一个nginx进行测试,能否进行外网测试

安装要求

在开始之前,部署Kubernetes集群机器需要满足以下几个条件:

  • 一台或多台机器,操作系统 CentOS7.x-x86_64
  • 硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘30GB或更多【注意master需要两核】
  • 可以访问外网,需要拉取镜像,如果服务器不能上网,需要提前下载镜像并导入节点
  • 禁止swap分区

环境准备

节点ip
k8s-master10.0.0.180
k8s-node110.0.0.181
k8s-node210.0.0.182

在每个机器执行如下命令,可以工具----发送键到所有会话

# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld

# 关闭selinux
# 永久关闭
sed -i 's/enforcing/disabled/' /etc/selinux/config  
# 临时关闭
setenforce 0  

# 关闭swap
# 临时
swapoff -a 
# 永久关闭
sed -ri 's/.*swap.*/#&/' /etc/fstab

# 根据规划设置主机名【master节点上操作】
hostnamectl set-hostname k8s-master
# 根据规划设置主机名【node1节点操作】
hostnamectl set-hostname k8s-node1
# 根据规划设置主机名【node2节点操作】
hostnamectl set-hostname k8s-node2

# 在master添加hosts
cat >> /etc/hosts << EOF
10.0.0.180 k8s-master
10.0.0.181 k8s-node1
10.0.0.182 k8s-node2
EOF


# 将桥接的IPv4流量传递到iptables的链
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
# 生效
sysctl --system  
sysctl -p

# 时间同步设置定时任务
yum install ntpdate -y
crontab -e
* * * * * /usr/sbin/ntpdate ntp.aliyun.com &>/dev/null

安装Docker/kubeadm/kubelet

所有节点安装Docker/kubeadm/kubelet ,Kubernetes默认CRI(容器运行时)为Docker,因此先安装Docker

安装docker

首先配置一下Docker的阿里yum源

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

安装docker

# yum安装
yum -y install docker-ce

# 查看docker版本
docker --version  

# 启动docker
systemctl enable docker
systemctl start docker

配置docker阿里加速源

mkdir -p /etc/docker


cat  >> /etc/docker/daemon.json <<EOF 
{
  "registry-mirrors": ["https://e76wqvv9.mirror.aliyuncs.com"]
}
EOF

# 重启docker
systemctl restart docker

添加kubernetes yum软件源

cat > /etc/yum.repos.d/kubernetes.repo << EOF
[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
EOF

安装kubeadm,kubelet和kubectl

kubelet # 运行在 Cluster 所有节点上,负责启动 Pod 和容器

kubeadm # 用于初始化 Cluster

kubectl # 是 Kubernetes 命令行工具。通过 kubectl 可以部署和管理应用,查看各种资源,创建、删除和更新各种组件

也可以指定版本号

yum install kubelet-1.20.1 kubeadm-1.20.1 kubectl-1.20.1 -y

# 设置开机自启
systemctl enable kubelet

部署Kubernetes Master(master节点上操作)

初始化kubeadm
(只需要修改apiserver-advertise-address及kubernetes-version)

先查看版本

[root@k8s-master ~]# kubelet --version
Kubernetes v1.20.1

kubeadm init \
--apiserver-advertise-address=10.0.0.180 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.20.1 \
--service-cidr=10.1.0.0/16 \
--pod-network-cidr=10.244.0.0/16

–image-repository string:
用于指定从什么位置来拉取镜像(1.13版本才有的),默认值是k8s.gcr.io,我们将其指定为国内镜像地址:registry.aliyuncs.com/google_containers

–kubernetes-version string:
指定kubenets版本号,默认值是stable-1,会导致从https://dl.k8s.io/release/stable-1.txt下载最新的版本号,我们可以将其指定为固定版本(v1.15.1)来跳过网络请求。

–apiserver-advertise-address 指明用 Master 的哪个 interface 与 Cluster的其他节点通信。如果 Master 有多个 interface,建议明确指定,如果不指定,kubeadm 会自动选择有默认网关的interface。

–pod-network-cidr 指定 Pod 网络的范围。Kubernetes支持多种网络方案,而且不同网络方案对pod-network-cidr有自己的要求,这里设置为10.244.0.0/16是因为我们将使用 flannel 网络方案,必须设置成这个 CIDR

初始化成功后会有提示信息,红色框内的命令是需要后续执行的(master节点执行第一个红框,node节点执行第二个红框)
在这里插入图片描述
master节点执行

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

所有node节点执行

kubeadm join 10.0.0.180:6443 --token uhtjon.tduranh20qsge775 \
    --discovery-token-ca-cert-hash sha256:6994f18e96bf6f8717cfe7586662952d33fc312e7f6348695e82533bc7734695 

默认token有效期为24小时,当过期之后,该token就不可用了。这时就需要重新创建token,操作如下:

kubeadm token create --print-join-command

在master节点查看信息

[root@k8s-master ~]# kubectl get nodes
NAME         STATUS     ROLES                  AGE    VERSION
k8s-master   NotReady   control-plane,master   43m    v1.20.1
k8s-node1    NotReady   <none>                 40s    v1.20.1
k8s-node2    NotReady   <none>                 7m8s   v1.20.1

部署CNI网络插件(只在master节点上操作)

上面的状态还是NotReady,下面我们需要网络插件,来进行联网访问

科学上网得到如下网站
https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# 失败了可以多尝试几次
 创建flannel.yml文件,将内容粘贴到其中
#然后执行
kubectl apply -f flannel.yml

flannel.yml内容如下:

---
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
  name: psp.flannel.unprivileged
  annotations:
    seccomp.security.alpha.kubernetes.io/allowedProfileNames: docker/default
    seccomp.security.alpha.kubernetes.io/defaultProfileName: docker/default
    apparmor.security.beta.kubernetes.io/allowedProfileNames: runtime/default
    apparmor.security.beta.kubernetes.io/defaultProfileName: runtime/default
spec:
  privileged: false
  volumes:
  - configMap
  - secret
  - emptyDir
  - hostPath
  allowedHostPaths:
  - pathPrefix: "/etc/cni/net.d"
  - pathPrefix: "/etc/kube-flannel"
  - pathPrefix: "/run/flannel"
  readOnlyRootFilesystem: false
  # Users and groups
  runAsUser:
    rule: RunAsAny
  supplementalGroups:
    rule: RunAsAny
  fsGroup:
    rule: RunAsAny
  # Privilege Escalation
  allowPrivilegeEscalation: false
  defaultAllowPrivilegeEscalation: false
  # Capabilities
  allowedCapabilities: ['NET_ADMIN', 'NET_RAW']
  defaultAddCapabilities: []
  requiredDropCapabilities: []
  # Host namespaces
  hostPID: false
  hostIPC: false
  hostNetwork: true
  hostPorts:
  - min: 0
    max: 65535
  # SELinux
  seLinux:
    # SELinux is unused in CaaSP
    rule: 'RunAsAny'
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: flannel
rules:
- apiGroups: ['extensions']
  resources: ['podsecuritypolicies']
  verbs: ['use']
  resourceNames: ['psp.flannel.unprivileged']
- apiGroups:
  - ""
  resources:
  - pods
  verbs:
  - get
- apiGroups:
  - ""
  resources:
  - nodes
  verbs:
  - list
  - watch
- apiGroups:
  - ""
  resources:
  - nodes/status
  verbs:
  - patch
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: flannel
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: flannel
subjects:
- kind: ServiceAccount
  name: flannel
  namespace: kube-system
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: flannel
  namespace: kube-system
---
kind: ConfigMap
apiVersion: v1
metadata:
  name: kube-flannel-cfg
  namespace: kube-system
  labels:
    tier: node
    app: flannel
data:
  cni-conf.json: |
    {
      "name": "cbr0",
      "cniVersion": "0.3.1",
      "plugins": [
        {
          "type": "flannel",
          "delegate": {
            "hairpinMode": true,
            "isDefaultGateway": true
          }
        },
        {
          "type": "portmap",
          "capabilities": {
            "portMappings": true
          }
        }
      ]
    }
  net-conf.json: |
    {
      "Network": "10.244.0.0/16",
      "Backend": {
        "Type": "vxlan"
      }
    }
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: kube-flannel-ds
  namespace: kube-system
  labels:
    tier: node
    app: flannel
spec:
  selector:
    matchLabels:
      app: flannel
  template:
    metadata:
      labels:
        tier: node
        app: flannel
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: kubernetes.io/os
                operator: In
                values:
                - linux
      hostNetwork: true
      priorityClassName: system-node-critical
      tolerations:
      - operator: Exists
        effect: NoSchedule
      serviceAccountName: flannel
      initContainers:
      - name: install-cni-plugin
        image: rancher/mirrored-flannelcni-flannel-cni-plugin:v1.0.0
        command:
        - cp
        args:
        - -f
        - /flannel
        - /opt/cni/bin/flannel
        volumeMounts:
        - name: cni-plugin
          mountPath: /opt/cni/bin
      - name: install-cni
        image: quay.io/coreos/flannel:v0.15.1
        command:
        - cp
        args:
        - -f
        - /etc/kube-flannel/cni-conf.json
        - /etc/cni/net.d/10-flannel.conflist
        volumeMounts:
        - name: cni
          mountPath: /etc/cni/net.d
        - name: flannel-cfg
          mountPath: /etc/kube-flannel/
      containers:
      - name: kube-flannel
        image: quay.io/coreos/flannel:v0.15.1
        command:
        - /opt/bin/flanneld
        args:
        - --ip-masq
        - --kube-subnet-mgr
        resources:
          requests:
            cpu: "100m"
            memory: "50Mi"
          limits:
            cpu: "100m"
            memory: "50Mi"
        securityContext:
          privileged: false
          capabilities:
            add: ["NET_ADMIN", "NET_RAW"]
        env:
        - name: POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        volumeMounts:
        - name: run
          mountPath: /run/flannel
        - name: flannel-cfg
          mountPath: /etc/kube-flannel/
      volumes:
      - name: run
        hostPath:
          path: /run/flannel
      - name: cni-plugin
        hostPath:
          path: /opt/cni/bin
      - name: cni
        hostPath:
          path: /etc/cni/net.d
      - name: flannel-cfg
        configMap:
          name: kube-flannel-cfg

再次查看状态

[root@k8s-master ~]# kubectl get pods -n kube-system
NAME                                 READY   STATUS    RESTARTS   AGE
coredns-7f89b7bc75-vn95t             1/1     Running   0          63m
coredns-7f89b7bc75-xc4xj             1/1     Running   0          63m
etcd-k8s-master                      1/1     Running   0          63m
kube-apiserver-k8s-master            1/1     Running   0          63m
kube-controller-manager-k8s-master   1/1     Running   0          63m
kube-flannel-ds-gf4h4                1/1     Running   0          8m11s
kube-flannel-ds-ldhc7                1/1     Running   0          8m11s
kube-flannel-ds-wn7mh                1/1     Running   0          8m11s
kube-proxy-b8dfk                     1/1     Running   0          20m
kube-proxy-js9rg                     1/1     Running   0          63m
kube-proxy-s54sk                     1/1     Running   0          27m
kube-scheduler-k8s-master            1/1     Running   0          63m


运行完成后,我们查看状态可以发现,已经变成了Ready状态了
[root@k8s-master ~]# kubectl get nodes
NAME         STATUS   ROLES                  AGE   VERSION
k8s-master   Ready    control-plane,master   63m   v1.20.1
k8s-node1    Ready    <none>                 21m   v1.20.1
k8s-node2    Ready    <none>                 27m   v1.20.1

如果上述操作完成后,还存在某个节点处于NotReady状态,可以在Master将该节点删除

# master节点将该节点删除
kubectl delete node k8s-node1
# 然后到k8snode1节点进行重置
 kubeadm reset
# 重置完后在加入
kubeadm join 10.0.0.180:6443 --token uhtjon.tduranh20qsge775 \
    --discovery-token-ca-cert-hash sha256:6994f18e96bf6f8717cfe7586662952d33fc312e7f6348695e82533bc7734695 

测试kubernetes集群

K8S是容器化技术,它可以联网去下载镜像,用容器的方式进行启动
在Kubernetes集群中创建一个pod,验证是否正常运行:

# 下载nginx 会联网拉取nginx镜像
[root@k8s-master ~]# kubectl create deployment nginx --image=nginx

# 查看状态 Running 表示运行成功
[root@k8s-master ~]# kubectl get pod
NAME                     READY   STATUS    RESTARTS   AGE
nginx-6799fc88d8-zzdqb   1/1     Running   0          117s

将端口暴露出去,让其它外界能够访问

# 暴露端口
[root@k8s-master ~]# kubectl expose deployment nginx --port=80 --type=NodePort
service/nginx exposed

# 查看一下对外的端口
[root@k8s-master ~]# kubectl get pod,svc
NAME                         READY   STATUS    RESTARTS   AGE
pod/nginx-6799fc88d8-zzdqb   1/1     Running   0          3m38s

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE
service/kubernetes   ClusterIP   10.1.0.1     <none>        443/TCP        76m
service/nginx        NodePort    10.1.51.12   <none>        80:31946/TCP   10s

我们到我们的宿主机浏览器上,访问如下地址

http://10.0.0.180:31946

在这里插入图片描述

3.2 使用二进制方式搭建K8S集群

四、部署k8s图像化界面(Dashboard)

1.安装dashboard

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.5/aio/deploy/recommended.yaml
# 注:如若以上下载不下来复制
https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.5/aio/deploy/recommended.yaml
网址在网页中打开,并复制里面的内容(在附件中),粘贴到 vi recommended.yaml  文件里,
在执行 kubectl apply -f recommended.yaml 命令。

2.映射端口

# 查看Dash board布置的状态
kubectl get pods -n kubernetes-dashboard

[root@kubernetes-master01 ~]# kubectl edit -n kubernetes-dashboard svc kubernetes-dashboard
type: NodePort         #需要修改这个文件将其改为NodePort

在这里插入图片描述
3.查看端口
在这里插入图片描述
4.浏览器测试
在这里插入图片描述
5.创建token

[root@k8s-master ~]# vim token.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
  annotations:
    rbac.authorization.kubernetes.io/autoupdate: "true"
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kube-system
#部署token到浏览器
[root@k8s-master ~]# kubectl apply -f token.yaml 
serviceaccount/admin-user created
clusterrolebinding.rbac.authorization.k8s.io/admin-user created
#查看token,并复制token码,进行粘贴登录Dash board
[root@k8s-master ~]# kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}') | grep 'token:' | awk -F: '{print $2}' | tr -d ' '
eyJhbGciOiJSUzI1NiIsImtpZCI6Ii1Xb0VOT29LYUlkN3ptWThTRUZJU1J6NGhVdU9WS0h3eXYtcW1OcU0zYzAifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLWI1N2Z6Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiIzMjNjMTczYS1kY2JiLTQwZDItODYxNS0zNTkxZDIwM2NmNDciLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZS1zeXN0ZW06YWRtaW4tdXNlciJ9.3HszYw2UxuWtROp_PK8i3FH7Q6mo3F3jpwuaqRUKKSW-PH2arxs5phErsJxt_pHQ5HmHaDb2OvRpbI5OAcgafaTfK5ufG5krhIduiwOVHqyRTZIQAY9yAAuRkBTQlglmxUsEwH_46yhaPDMOR5bpVnzoJzlSSNcYkAM1_NC8mkYc-LDkS6y0Rs4msWwxIO7qDYvvdMHq63ClZ7RC8wF0OVDZx_7N-S0yz3PRj7NXhbn25JuO7WJqNyVZfRSDLkLvBMIU3M3ecNLSNuKuZkYfIQ9rA55g5iaxUoWA-t6iR-anC82JWcW6ml6wGnYYgB7xflEgF0ppC1v3nfp_gBAKLg

将token复制到浏览器:
在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值