参考官方文档进行部署:Kubernetes
一、环境准备
本次实验使用的操作系统为:Centos stream 9
1.1 节点规划
-
一台兼容的 Linux 主机。Kubernetes 项目为基于 Debian 和 Red Hat 的 Linux 发行版以及一些不提供包管理器的发行版提供通用的指令。
-
每台机器 2 GB 或更多的 RAM(如果少于这个数字将会影响你应用的运行内存)。
-
CPU 2 核心及以上。
-
集群中的所有机器的网络彼此均能相互连接(公网和内网都可以)。
-
节点之中不可以有重复的主机名、MAC 地址或 product_uuid。
主机名 | IP | 角色 | CPU/内存 |
---|---|---|---|
master | 10.45.25.100 | 控制节点 | 4核/4G |
node1 | 10.45.25.101 | 服务运行节点 | 8核/8G |
node2 | 10.45.25.102 | 服务运行节点 | 8核/8G |
# 每个节点修改对应的主机名并配置hosts解析。
[root@localhost ~]# hostnamectl hostname master/node{1,2}
[root@master ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
10.45.25.100 master
10.45.25.101 node1
10.45.25.102 node2
# 确保每个节点上 MAC 地址和 product_uuid 的唯一性(在克隆完虚拟机之后,进入网卡设置中,重新生成MAC地址)
ip link 或 ifconfig -a #获取网络接口的 MAC 地址
sudo cat /sys/class/dmi/id/product_uuid #校验 product_uuid
1.2 协议和端口
当你在一个有严格网络边界的环境里运行 Kubernetes,例如拥有物理网络防火墙或者拥有公有云中虚拟网络的自有数据中心, 了解 Kubernetes 组件使用了哪些端口和协议是非常有用的。
控制面
协议 | 方向 | 端口范围 | 目的 | 使用者 |
---|---|---|---|---|
TCP | 入站 | 6443 | Kubernetes API 服务器 | 所有 |
TCP | 入站 | 2379-2380 | etcd 服务器客户端 API | kube-apiserver、etcd |
TCP | 入站 | 10250 | kubelet API | 自身、控制面 |
TCP | 入站 | 10259 | kube-scheduler | 自身 |
TCP | 入站 | 10257 | kube-controller-manager | 自身 |
尽管 etcd 的端口也列举在控制面的部分,但你也可以在外部自己托管 etcd 集群或者自定义端口。
工作节点
协议 | 方向 | 端口范围 | 目的 | 使用者 |
---|---|---|---|---|
TCP | 入站 | 10250 | kubelet API | 自身、控制面 |
TCP | 入站 | 10256 | kube-proxy | 自身、负载均衡器 |
TCP | 入站 | 30000-32767 | NodePort Services† | 所有 |
所有默认端口都可以重新配置。当使用自定义的端口时,你需要打开这些端口来代替这里提到的默认端口。
一个常见的例子是 API 服务器的端口有时会配置为 443。或者你也可以使用默认端口, 把 API 服务器放到一个监听 443 端口的负载均衡器后面,并且路由所有请求到 API 服务器的默认端口
关闭防火墙
systemctl stop firewalld && systemctl disable firewalld
关闭selinux
setenforce 0 #临时关闭
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config #永久关闭
1.3 关闭交换分区
-
交换分区的配置。kubelet 的默认行为是在节点上检测到交换内存时无法启动。
-
# 临时关闭 sudo swapoff -a # 永久关闭 sed -ri 's/.*swap.*/#&/' /etc/fstab
-
如果 kubelet 未被正确配置使用交换分区,则你必须禁用交换分区。 例如,
sudo swapoff -a
将暂时禁用交换分区。要使此更改在重启后保持不变,请确保在如/etc/fstab
、systemd.swap
等配置文件中禁用交换分区,具体取决于你的系统如何配置。
-
1.4 安装容器运行时
默认情况下,Kubernetes 使用 容器运行时接口(Container Runtime Interface,CRI) 来与你所选择的容器运行时交互。
说明:v1.24 之前的 Kubernetes 版本直接集成了 Docker Engine 的一个组件,名为 dockershim。 这种特殊的直接整合不再是 Kubernetes 的一部分 (这次删除被作为 v1.20 发行版本的一部分宣布)。
安装和配置先决条件
默认情况下,Linux 内核不允许 IPv4 数据包在接口之间路由。 大多数 Kubernetes 集群网络实现都会更改此设置(如果需要),但有些人可能希望管理员为他们执行此操作。 (有些人可能还期望设置其他 sysctl 参数、加载内核模块等;请参阅你的特定网络实施的文档。)
配置加载内核及IPv4 数据包转发
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
modprobe overlay
modprobe br_netfilter
# 设置所需的 sysctl 参数,参数在重新启动后保持不变
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
# 应用 sysctl 参数而不重新启动
sysctl --system
# 使用以下命令验证 net.ipv4.ip_forward 是否设置为 1
sysctl net.ipv4.ip_forward
安装containerd
## 1、containerd
# 下载包
wget https://github.com/containerd/containerd/releases/download/v1.7.22/containerd-1.7.22-linux-amd64.tar.gz
# 将下载的包解压到/usr/local下
tar Cxzvf /usr/local containerd-1.7.22-linux-amd64.tar.gz
# 下载服务启动文件
wget -O /etc/systemd/system/containerd.service https://raw.githubusercontent.com/containerd/containerd/main/containerd.service
# 文件内容如下,下载不下来直接复制
cat /etc/systemd/system/containerd.service
[Unit]
Description=containerd container runtime
Documentation=https://containerd.io
After=network.target local-fs.target
[Service]
ExecStartPre=-/sbin/modprobe overlay
ExecStart=/usr/local/bin/containerd
Type=notify
Delegate=yes
KillMode=process
Restart=always
RestartSec=5
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNPROC=infinity
LimitCORE=infinity
# Comment TasksMax if your systemd version does not supports it.
# Only systemd 226 and above support this version.
TasksMax=infinity
OOMScoreAdjust=-999
[Install]
WantedBy=multi-user.target
# 启动containerd
systemctl daemon-reload
systemctl enable --now containerd
## 2、Installing runc
wget https://github.com/opencontainers/runc/releases/download/v1.2.0-rc.3/runc.amd64
install -m 755 runc.amd64 /usr/local/sbin/runc
将containerd切换为国内源
# 创建containerd目录
mkdir /etc/containerd
# 恢复默认配置文件
containerd config default > /etc/containerd/config.toml
# 切换为国内源
sed -i 's/registry.k8s.io/registry.aliyuncs.com\/google_containers/' /etc/containerd/config.toml
# 修改SystemCgroup为true
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true
# 重启服务
systemctl daemon-reload
systemctl restart containerd
配置containerd镜像加速
参考文档:解决镜像加速问题-CSDN博客
[root@master ~]# vim /etc/containerd/config.toml
[plugins."io.containerd.grpc.v1.cri".registry]
config_path = "/etc/containerd/certs.d" #修改此处
[root@master ~]# mkdir -p /etc/containerd/certs.d/docker.io
# docker hub加速
[root@master ~]# vim /etc/containerd/certs.d/docker.io/hosts.toml
[root@master ~]# cat /etc/containerd/certs.d/docker.io/hosts.toml
server ="https://docker.io"
[host."https://docker.m.daocloud.io"]
capabilities =["pull","resolve"]
[host."https://reg-mirror.giniu.com"]
capabilities =["pull","resolve"]
# registry.k8s.io镜像加速
[root@master ~]# mkdir -p /etc/containerd/certs.d/registry.k8s.io
[root@master ~]# vim /etc/containerd/certs.d/registry.k8s.io/hosts.toml
[root@master ~]# cat /etc/containerd/certs.d/registry.k8s.io/hosts.toml
server ="https://registry.k8s.io"
[host."https://k8s.m.daocloud.io"]
capabilities =["pull","resolve","push"]
# 重启服务(更多加速文档参考上述文档)
[root@master ~]# systemctl daemon-reload
[root@master ~]# systemctl restart containerd.service
二、安装kubeadm、kubelet 和 kubectl
你需要在每台机器上安装以下的软件包:
kubeadm
:用来初始化集群的指令。
kubelet
:在集群中的每个节点上用来启动 Pod 和容器等。
kubectl
:用来与集群通信的命令行工具
添加 Kubernetes 的 yum
仓库。
# 此操作会覆盖 /etc/yum.repos.d/kubernetes.repo 中现存的所有配置
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.31/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.31/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
EOF
安装 kubelet、kubeadm 和 kubectl,并启用 kubelet 以确保它在启动时自动启动:
sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
sudo systemctl enable --now kubelet
kubelet 现在每隔几秒就会重启,因为它陷入了一个等待 kubeadm 指令的死循环。
三、使用kubeadm 创建集群
3.1 拉取所需镜像
kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers
3.2 初始化控制平面节点
# 创建初始化配置文件
kubeadm config print init-defaults > /etc/kubernetes/init-default.yaml
# 修改为国内阿里源
sed -i 's/registry.k8s.io/registry.aliyuncs.com\/google_containers/' /etc/kubernetes/init-default.yaml
# 设置 apiServerIP 地址. 请自行替换10.45.25.100为自己宿主机IP
sed -i 's/1.2.3.4/10.45.25.100/' /etc/kubernetes/init-default.yaml
# 文件内容
[root@master ~]# cat /etc/kubernetes/init-default.yaml
apiVersion: kubeadm.k8s.io/v1beta4
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 10.45.25.100
bindPort: 6443
nodeRegistration:
criSocket: unix:///var/run/containerd/containerd.sock
imagePullPolicy: IfNotPresent
imagePullSerial: true
name: node
taints: null
timeouts:
controlPlaneComponentHealthCheck: 4m0s
discovery: 5m0s
etcdAPICall: 2m0s
kubeletHealthCheck: 4m0s
kubernetesAPICall: 1m0s
tlsBootstrap: 5m0s
upgradeManifests: 5m0s
---
apiServer: {}
apiVersion: kubeadm.k8s.io/v1beta4
caCertificateValidityPeriod: 87600h0m0s
certificateValidityPeriod: 8760h0m0s
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
encryptionAlgorithm: RSA-2048
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: 1.31.0
networking:
dnsDomain: cluster.local
serviceSubnet: 10.96.0.0/12
podSubnet: 192.168.0.0/16 #加入此句
proxy: {}
scheduler: {}
# 初始化主节点
kubeadm init --image-repository registry.aliyuncs.com/google_containers
部署完成后的提示信息
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 10.45.25.100:6443 --token jiokmj.y0rsa5h405xoqiqa \
--discovery-token-ca-cert-hash sha256:fecc31fd4893745db901671e1cf491263f90d72e61b8aec4cbad5b6005e47170
在开始使用群集,您需要以普通用户身份运行以下操作:
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 网络。
# 查看集群状态,此时 coredns 服务为Pending状态,我们需要安装网络插件
[root@master ~]# kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-6ddff5bd6d-4pq6v 0/1 Pending 0 2m2s
kube-system coredns-6ddff5bd6d-tgc2c 0/1 Pending 0 2m2s
kube-system etcd-master 1/1 Running 13 2m9s
kube-system kube-apiserver-master 1/1 Running 0 2m9s
kube-system kube-controller-manager-master 1/1 Running 0 2m10s
kube-system kube-proxy-chpq6 1/1 Running 0 2m3s
kube-system kube-scheduler-master 1/1 Running 18 2m9s
3.3 安装网络插件
常见的 Kubernetes 网络插件有:Calico、Flannel、Cilium、Weave Net等,下面列举calico和flannel的部署(安装其中一个即可)。
Calico
Calico 是一个联网和网络策略供应商。 Calico 支持一套灵活的网络选项,因此你可以根据自己的情况选择最有效的选项,包括非覆盖和覆盖网络,带或不带 BGP。 Calico 使用相同的引擎为主机、Pod 和(如果使用 Istio 和 Envoy)应用程序在服务网格层执行网络策略。
方法一:暂时不可行
mkdir calico && cd calico
# 1、Install the Tigera Calico operator and custom resource definitions.
wget https://raw.githubusercontent.com/projectcalico/calico/v3.28.1/manifests/tigera-operator.yaml
kubectl create -f tigera-operator.yaml
# 2、Install Calico by creating the necessary custom resource. For more information on configuration options available in this manifest, see the installation reference.
wget https://raw.githubusercontent.com/projectcalico/calico/v3.28.1/manifests/custom-resources.yaml
kubectl create -f custom-resources.yaml
# 3、Confirm that all of the pods are running with the following command.
watch kubectl get pods -n calico-system
方法二:
# 注:由于访问不了外网所以需要使用梯子把包下载下来,再将所需的镜像传到虚拟机中,并导入到每台主机
# 导入镜像命令如下
ctr -n k8s.io images import calico-node.tar
ctr -n k8s.io images import calico-cni.tar
ctr -n k8s.io images import calico-kube-controllers.tar
# 下载Kubernetes API数据存储的Calico网络清单,50个节点或更少。
wget https://raw.githubusercontent.com/projectcalico/calico/v3.28.1/manifests/calico.yaml
# 如果您使用的是pod CIDR 192.168.0.0/16,直接部署calico即可。如果您在kubeadm中使用不同的pod CIDR,则不需要进行任何更改——Calico将根据运行配置自动检测CIDR。对于其他平台,请确保在清单中取消注释CALICO_IPV4POOL_CIDR变量,并将其设置为与所选pod CIDR相同的值。
# 部署calico
kubectl apply -f calico.yaml
Flannel
Flannel是一个简单、高效的容器网络解决方案,适用于需要在多个主机上运行容器的场景。它通过虚拟网络技术和 |P 地址管理来实现容器之间的通信和跨丰机连接,为容器平台提供了可靠的网络基础设施。
# 在使用方法一之前需要在kube-controller-manager中加入cidr
vim /etc/kubernetes/manifests/kube-controller-manager.yaml
spec:
containers:
- command:
- kube-controller-manager
..............
- --allocate-node-cidrs=true #加入
- --cluster-cidr=192.168.0.0/16 #这两句
# 重启kubelet
systemctl status kubelet.service
方法一:
# 使用kubectl安装
wget https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
# 修改network,因为初始化集群时指定的podCIDR为192.168.0.0/16
# 如果指定的是10.244.0.0/16则无需修改
vim kube-flannel.yml
net-conf.json: |
{
"Network": "192.168.0.0/16",
# 应用部署
kubectl apply -f kube-flannel.yml
方法二:由于网络原因,暂时行不通
# 使用heml安装,首先需要安装helm,安装helm的方法在7.1
# Needs manual creation of namespace to avoid helm error
kubectl create ns kube-flannel
kubectl label --overwrite ns kube-flannel pod-security.kubernetes.io/enforce=privileged
helm repo add flannel https://flannel-io.github.io/flannel/
helm install flannel --set podCidr="192.168.0.0/16" --namespace kube-flannel flannel/flannel
小结
# 在网络插件部署完成后,就可以看到coredns正常运行了
[root@master ~]# kubectl get pod -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-flannel kube-flannel-ds-vzxfc 1/1 Running 0 4m3s
kube-system coredns-855c4dd65d-7zrfx 1/1 Running 0 51m
kube-system coredns-855c4dd65d-nr54p 1/1 Running 0 51m
kube-system etcd-master 1/1 Running 0 51m
kube-system kube-apiserver-master 1/1 Running 0 51m
kube-system kube-controller-manager-master 1/1 Running 0 4m35s
kube-system kube-proxy-hhr82 1/1 Running 0 51m
kube-system kube-scheduler-master 1/1 Running 0 51m
[root@master ~]#
四、加入node节点
kubeadm join 10.45.25.100:6443 --token jiokmj.y0rsa5h405xoqiqa \
--discovery-token-ca-cert-hash sha256:fecc31fd4893745db901671e1cf491263f90d72e61b8aec4cbad5b6005e47170
# 生成新令牌
kubeadm token create --print-join-command
五、验证集群
[root@master ~]# kubectl get nodes -A
NAME STATUS ROLES AGE VERSION
master Ready control-plane 109m v1.31.0
node1 Ready <none> 2m3s v1.31.0
node2 Ready <none> 116s v1.31.0
[root@master ~]#
# 创建pod并向外暴露端口,检测网络可用性
[root@master ~]# vim nginx.yaml
[root@master ~]# cat nginx.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app.kubernetes.io/name: MyApp
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
name: http-web-svc
---
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
type: NodePort
selector:
app.kubernetes.io/name: MyApp
ports:
# 默认情况下,为了方便起见,`targetPort` 被设置为与 `port` 字段相同的值。
- port: 80
targetPort: 80
# 可选字段
# 默认情况下,为了方便起见,Kubernetes 控制平面会从某个范围内分配一个端口号
#(默认:30000-32767)
nodePort: 30007
[root@master ~]# kubectl apply -f nginx.yaml
[root@master ~]# kubectl get pod,svc
NAME READY STATUS RESTARTS AGE
pod/nginx 1/1 Running 0 72s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 128m
service/my-service NodePort 10.111.129.97 <none> 80:30007/TCP 72s
[root@master ~]#
浏览器访问:集群IP:30007
六、启用 kubectl 自动补全
# Install bash-completion
yum install -y bash-completion
# Source the completion script in your ~/.bashrc file
echo 'source <(kubectl completion bash)' >>~/.bashrc
# Add the completion script to the /etc/bash_completion.d directory
kubectl completion bash >/etc/bash_completion.d/kubectl
#重新加载shell生效
七、部署kubernetes仪表板
Dashboard 是基于网页的 Kubernetes 用户界面。 你可以使用 Dashboard 将容器应用部署到 Kubernetes 集群中,也可以对容器应用排错,还能管理集群资源。 你可以使用 Dashboard 获取运行在集群中的应用的概览信息,也可以创建或者修改 Kubernetes 资源 (如 Deployment、Job、DaemonSet 等等)。 例如,你可以对 Deployment 实现弹性伸缩、发起滚动升级、重启 Pod 或者使用向导创建新的应用。
使用heml部署
# 下载 helm
wget https://get.helm.sh/helm-v3.16.1-linux-amd64.tar.gz
tar zxf helm-v3.16.1-linux-amd64.tar.gz
mv linux-amd64/helm /usr/local/bin/helm && rm -rf linux-amd64
当您已经安装好了Helm之后,您可以添加一个chart 仓库。从 Artifact Hub中查找有效的Helm chart仓库。
helm repo add bitnami https://charts.bitnami.com/bitnami
当添加完成,您将可以看到可以被您安装的charts列表:
[root@master ~]# helm search repo bitnami
NAME CHART VERSION APP VERSION DESCRIPTION
bitnami/airflow 19.0.8 2.10.1 Apache Airflow is a tool to express and execute...
bitnami/apache 11.2.18 2.4.62 Apache HTTP Server is an open-source HTTP serve...
bitnami/apisix 3.4.0 3.10.0 Apache APISIX is high-performance, real-time AP...
bitnami/appsmith 4.0.7 1.40.0 Appsmith is an open source platform for buildin...
bitnami/argo-cd 7.0.11 2.12.3 Argo CD is a continuous delivery tool for Kuber...
bitnami/argo-workflows 9.1.14 3.5.10 Argo Workflows is meant to orchestrate Kubernet...
···············································
部署 Dashboard UI
# 添加 kubernetes-dashboard 仓库
helm repo add kubernetes-dashboard https://kubernetes.github.io/dashboard/
# 使用 kubernetes-dashboard Chart 部署名为 `kubernetes-dashboard` 的 Helm Release
helm upgrade --install kubernetes-dashboard kubernetes-dashboard/kubernetes-dashboard --create-namespace --namespace kubernetes-dashboard
设置访问端口
kubectl edit svc kubernetes-dashboard-kong-proxy -n kubernetes-dashboard
修改service的type类型为NodePort
,使其可以外部访问
[root@master ~]# kubectl -n kubernetes-dashboard get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes-dashboard-api ClusterIP 10.101.101.171 <none> 8000/TCP 4m4s
kubernetes-dashboard-auth ClusterIP 10.99.7.104 <none> 8000/TCP 4m4s
kubernetes-dashboard-kong-manager NodePort 10.104.27.216 <none> 8002:31985/TCP,8445:30947/TCP 4m4s
kubernetes-dashboard-kong-proxy NodePort 10.102.153.149 <none> 443:31552/TCP 4m4s
kubernetes-dashboard-metrics-scraper ClusterIP 10.104.74.246 <none> 8000/TCP 4m4s
kubernetes-dashboard-web ClusterIP 10.104.227.225 <none> 8000/TCP 4m4s
[root@master ~]#
访问: https://集群任意IP:端口 https://10.45.25.100:31552
创建访问账号
vim /etc/kubernetes/dashadm.yaml
#创建服务帐户
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard
---
#创建群集角色绑定
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kubernetes-dashboard
kubectl apply -f /etc/kubernetes/dashadm.yaml
获取访问令牌
kubectl -n kubernetes-dashboard create token admin-user
使用kubectl部署
# 此为老版本
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.6.1/aio/deploy/recommended.yaml
# 修改镜像地址
[root@master ~]# grep 'image:' recommended.yaml
image: registry.cn-hangzhou.aliyuncs.com/google_containers/dashboard:v2.7.0
image: registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-scraper:v1.0.8
[root@master ~]#
# 部署dashboard
[root@master ~]# kubectl apply -f recommended.yaml
[root@master ~]# kubectl get pods -n kubernetes-dashboard
NAME READY STATUS RESTARTS AGE
dashboard-metrics-scraper-86f7cf4cd8-jxrwk 1/1 Running 0 4m51s
kubernetes-dashboard-6d64b4c7b4-cjhdg 1/1 Running 0 4m51s
[root@master ~]#
# 设置访问端口
kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard
# type: ClusterIP 改为 type: NodePort
# 查看对外暴露的端口,443:30659
[root@master ~]# kubectl get svc -n kubernetes-dashboard
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
dashboard-metrics-scraper ClusterIP 10.100.114.8 <none> 8000/TCP 6m44s
kubernetes-dashboard NodePort 10.103.128.73 <none> 443:30659/TCP 6m44s
[root@master ~]#
# 创建访问账号
[root@master ~]# vi dash.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kubernetes-dashboard
[root@master ~]# kubectl apply -f dash.yaml
#获取访问令牌
kubectl -n kubernetes-dashboard get secret $(kubectl -n kubernetes-dashboard get sa/admin-user -o jsonpath="{.secrets[0].name}") -o go-template="{{.data.token | base64decode}}"
# 创建新的令牌
[root@master ~]# kubectl -n kubernetes-dashboard create token admin-user
eyJhbGciOiJSUzI1NiIsImtpZCI6IkJYNnc2U1lWRDRfZ29iajFleHg3SDFoQ3luNUo2WHd5ZGpBSjV6YV93aG8ifQ.eyJhdWQiOlsiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWwiXSwiZXhwIjoxNzI2MzkwMTU3LCJpYXQiOjE3MjYzODY1NTcsImlzcyI6Imh0dHBzOi8va3ViZXJuZXRlcy5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsIiwianRpIjoiNDBhY2I1NTAtMTMyOC00M2RiLWEzZWEtMGY1YzE5MGI4OGNkIiwia3ViZXJuZXRlcy5pbyI6eyJuYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsInNlcnZpY2VhY2NvdW50Ijp7Im5hbWUiOiJhZG1pbi11c2VyIiwidWlkIjoiYWQxZGMwMDUtYjcxNy00YjNhLTliMDktNDkwMGQ2NTQxOWVhIn19LCJuYmYiOjE3MjYzODY1NTcsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlcm5ldGVzLWRhc2hib2FyZDphZG1pbi11c2VyIn0.kjyp0R9LhJbP6zihUc7U7Msl8Wt1Lq8ERR2kQhnsFGDXltS8sK2K1SBuPl13r5c2tM8AYZfw0CyD9F1lTAw3R2ZTJx213deKwTHVeLE_OIvlw3oemvPZDnnKBYSipvg6IxZjCeuKRitvPidoD8HDzGxODcA1b-Ujcc4zlKV3WWKMOfS_Z9lQoCeA1j5pUBJUJbE-PhlQ7Ro25fnHa0fIImT7n7CBcoU9AWTf6FTE-mP9tvuYDNd3sF-tXBjGh3JsXxLwJ749n2ePjIKTk21h2u7LvWIZixnJqB2LsaAgTWyZmPyfZ__pEea8MyBMSr5Rztyhb_VuHJZLmfsOaeQcAA
[root@master ~]#
使用令牌登录
登录成功界面