Kubernetes最新版本部署完整过程(1.31)

参考官方文档进行部署:Kubernetes

一、环境准备

本次实验使用的操作系统为:Centos stream 9

1.1 节点规划

  • 一台兼容的 Linux 主机。Kubernetes 项目为基于 Debian 和 Red Hat 的 Linux 发行版以及一些不提供包管理器的发行版提供通用的指令。

  • 每台机器 2 GB 或更多的 RAM(如果少于这个数字将会影响你应用的运行内存)。

  • CPU 2 核心及以上。

  • 集群中的所有机器的网络彼此均能相互连接(公网和内网都可以)。

  • 节点之中不可以有重复的主机名、MAC 地址或 product_uuid。

主机名IP角色CPU/内存
master10.45.25.100控制节点4核/4G
node110.45.25.101服务运行节点8核/8G
node210.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入站6443Kubernetes API 服务器所有
TCP入站2379-2380etcd 服务器客户端 APIkube-apiserver、etcd
TCP入站10250kubelet API自身、控制面
TCP入站10259kube-scheduler自身
TCP入站10257kube-controller-manager自身

尽管 etcd 的端口也列举在控制面的部分,但你也可以在外部自己托管 etcd 集群或者自定义端口。

工作节点

协议方向端口范围目的使用者
TCP入站10250kubelet API自身、控制面
TCP入站10256kube-proxy自身、负载均衡器
TCP入站30000-32767NodePort 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/fstabsystemd.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 初始化控制平面节点

https://pkg.go.dev/k8s.io/kubernetes@v1.31.1/cmd/kubeadm/app/apis/kubeadm/v1beta4#hdr-Kubeadm_init_configuration_types

# 创建初始化配置文件
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 ~]# 

使用令牌登录

登录成功界面

附录

UDS(统一诊断服务)是在车辆中使用的一种通信协议,它是基于ISO 14229标准开发的,用于车辆的诊断通信。在UDS中,数据的传输涉及多种不同类型的,包括连续帧和多等。 连续帧(Flow Control Frame):在处理较大的数据传输时,如果数据量超过了能够承载的大小,就需要将数据分割成多个来传输。连续帧用于标记一个数据消息的多个的连续部分。它们通常会包含一个连续帧计数器,这个计数器会指明当前是该消息中的第几,以及消息总共有多少(Flow Control Frame):用于制数据的发送速率,确保发送端和接收端的数据处理能够匹配。可以是正向的,比如发送方请求继续发送更多的数据,也可以是反向的,比如接收方请求发送方减慢发送速度或者暂停发送。在UDS中,制通常通过发送特定的消息(如ISO 14229-3中定义的和连续帧)来实现。 多(Multi Frame):当传输的数据量超过一个的最大数据载荷时,就需要使用多传输。多传输涉及到将数据分成多个连续的,每个都有序号和总数的信息,接收方通过这些信息将多个重新组合成原始的数据消息。 在使用多传输时,发送方和接收方之间的通信需要有相应的协议来确保数据的完整性和顺序性。如果在数据传输过程中,接收方没有正确地接收到某个,它可以通过发送来请求重传那个特定的
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值