Kubernetes
一、Kubernetes简介1.1 kubernetes简介kubernetes,简称K8s,是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes 的目标是让部署容器化的应用简单并且高效(powerful), 能够进行应用的自动化部署和扩缩容。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-master | 10.0.0.180 |
k8s-node1 | 10.0.0.181 |
k8s-node2 | 10.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复制到浏览器:
更多推荐
所有评论(0)