1、環境說明
- 基于
kubeadm工具部署k8s集群- (還有基于
二進制的部署方式但是需要單獨部署k8s的每個組件比較繁瑣) - kubeadm是 Kubernetes官?提供的?于快速部署Kubernetes集群的?具
- (還有基于
- 基于
Kubernetes v1.17.0版本部署
2、搭建要求
- k8s對于服務器的系統配置有一定要求
1、一臺或多臺運行著下列系統的機器:
- Ubuntu 16.04+
- Debian 9+
- CentOS 7+
- Red Hat Enterprise Linux (RHEL) 7+
- Fedora 25+
- HypriotOS v1.0.1+
- Flatcar Container Linux (使用 2512.3.0 版本測驗通過)
2、每臺機器 2 GB 或更多的 RAM (如果少于這個數字將會影響你應用的運行記憶體)
3、 CPU為2核或更多
4、集群中的所有機器的網路彼此均能相互連接(公網和內網都可以),并且可以訪問外網
5、節點之中不可以有重復的主機名、MAC 地址或 product_uuid
6、開啟機器上的某些埠、請參見這里 了解更多詳細資訊,
7、禁用swap磁區,為了保證 kubelet 正常作業,你 必須 禁用交換磁區
3、集群規劃
服務器串列
| 主機 | 角色 | IP |
|---|---|---|
| hadoop300 | Master | 192.168.2.100 |
| hadoop301 | Node-1 | 192.168.2.101 |
| hadoop302 | Node-2 | 192.168.2.102 |
每臺主機需安裝的組件
| 組件 | hadoop300(master) | hadoop301 | hadoop302 |
|---|---|---|---|
| kubelet | V | V | V |
| Docker | V | V | V |
| kubeadm | V | V | V |
| kubectl | V | V | V |
Docker: 使用Docker作為Kubernetes的CRI(容器運行時)tip: 聽說最新版本的k8s不在使用docker了
kubelet: 它運?在所有節點上,主要負責去啟動容器和 Podkubeadm: 一個簡化部署k8s的工具,部署后基本很少使用, 除非升級k8skubectl: k8s命令??具,通過它去與k8s對話, 管理k8s的各種資源.
4、架構
4.1 Kubernetes組件架構

API服務器:就是一個web服務, 對k8s各種資源(Pod,Service,RC) 的增刪改查, 也是集群內各個組件之間資料交換的中間人etcd: 采用raft協議作為一致性演算法實作的分布式的key-value資料庫, 用于存盤資源資訊Controller Manager: 應用集群管理者, 管理副本,節點,資源,命名空間,服務等. 如RC,RSScheduler: 負責把 Pod 調度到 Node 上,不過調度完以后就由 kubelet 來管理 Node 了,kubelet: 處理Scheduler 的調度任務并且完成資源調度以后,kubelet 行程會在 APIServer 上注冊 Node 資訊,定期向 Master 匯報 Node 資訊, 同時管理 Pod 及 Pod 中的容器,proxy: 實作service的通信與負載均衡機制, 負責為Pod創建代理服務,實作server到Pod的請求路由和轉發,從而實作K8s層級的虛擬轉發網路,
4.2 Kubernetes網路架構
-
節點與節點通信通過物理網卡
-
跨節點的Pod之間通信通過虛擬的網路層(比如Flannel或者Calico)
-
同一節點的Pod之間通信通過docker虛擬網橋
-
Pod內部的容器間的通信通過共享網路空間Pause
-
外網的通信通過Service層

這里選擇的Flannel 網路方案, 具體架構為:

Flannel是針對Kubernetes設計的一個網路規劃服務,是一種應用層網路,覆寫網路, 通過在每個節點上部署一個flanneld行程去監聽一個埠的TCP資料包, 收到資料包后去對原始網路通信轉發協議再包了一層, 就像HTTP是在TCP之上再封裝一層資料包, 然后可以通過域名訪問.- 比如節點1的
flanneld行程會監聽一個埠, 并且將收到來自節點1的Pod的資料后進行協議包裝, 然后根據協議轉發到節點2的Flanneld行程, 然后其再轉發給對應的Pod, 從而實作跨節點的Pod的通信. - etcd是一種key-value分布式資料庫, 維護所有
docker網橋和其下的pod的所有ip地址的映射關系, 通過這個映射關系就可以知道最終要訪問的pod是在哪個主機下的哪個docker網橋下的哪個ip地址, 并且保證了所有node上flanned所看到的配置是一致的,同時每個node上的flanned監聽etcd上的資料變化,實時感知集群中node的變化,
4.3 部署應用的作業流程
- 當運行
kubectl命令時 通過向 KubemetesAPI 服務器發送一個 HTTP 請求,在集群中創建一個新的Replication Controller物件 然后,ReplicationController 建了1 個新的pod,調度器Scheduler將其調度到 一個作業節點上, Kubelet 看到 pod 被調度到節點上,就告知 Docker 從鏡像中心中拉取指定的鏡像,因為本地沒有該鏡像, 下載鏡像后, Docker會啟動運行該容器

5、安裝
假設你已經為集群每臺服務器安裝了docker, 配置了獨立主機名,靜態IP地址, 關閉了防火墻, 并且能互相免密登陸
5.1 前期準備
5.1.1、禁?SELINUX
- linux的 SELINUX 主要作用就是最大限度地減小系統中服務行程可訪問的資源
每臺主機都要配置
- 修改
/etc/selinux/config檔案, 修改如下:
SELINUX=disabled
或者直接執行下面👇命令
- xcall 是可以同時在多臺服務器上呼叫一個命令
[root@hadoop300 ~]$ xcall "sed -i 's/\SELINUX=.*/SELINUX=disabled/' /etc/selinux/config"
5.1.2、關閉swap磁區
- linux 的 swap也叫虛擬記憶體, 在物理記憶體不夠用時,作業系統會從物理記憶體中把部分暫時不被使用的資料轉移到交換磁區,從而為當前運行的程式留出足夠的物理記憶體空間. 但是k8s認為非常影響性能
每臺主機都要配置
修改 /etc/fstab 檔案, 修改如下:
# 注釋掉即可
#/dev/mapper/centos-swap swap swap defaults 0 0
重啟后查看swap狀態
[root@hadoop300 ~]# free -mh
total used free shared buff/cache available
Mem: 3.8G 815M 2.2G 10M 795M 2.8G
Swap: 0B 0B 0B
5.1.3、配置docker的 阿里云下載源(可選)
- 在國內網路不好情況下, k8s拉取鏡像總是失敗導致應用部署失敗
每臺主機都要配置
修改/etc/docker/daemon.json 檔案, 修改如下
{
"registry-mirrors":["https://jccl15o4.mirror.aliyuncs.com"]
}
之后重啟docker配置
[root@hadoop300 tmp]# systemctl daemon-reload
[root@hadoop300 tmp]# systemctl restart docker
5.1.4、配置阿里云yum軟體源
創建/etc/yum.repos.d/kubrenetes.repo 檔案
[root@hadoop300 ~]$ 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
5.2 安裝kubeadm,kubelet和kubectl
- 這些組件都在yum源可以下,直接yum安裝即可
每臺主機都要
[root@hadoop300 ~]$ yum install -y kubelet-1.17.0 kubeadm-1.17.0 kubectl-1.17.0
設定 kubelet 為 開機啟動
[root@hadoop300 ~] systemctl enable kubelet
[root@hadoop300 ~] systemctl start kubelet
5.3 部署Master節點
- 使用
kubeadm工具初始化 k8s集群- 確保docker已啟動
- 確保root用戶執行
5.3.1 初始化K8s集群
在hadoop300主機執行
[root@hadoop300 ~]$kubeadm init \
--apiserver-advertise-address=192.168.2.100 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.17.0 \
--pod-network-cidr=10.244.0.0/16
[引數說明]
apiserver-advertise-address: 指定 API Server的IP地址image-repository: 默認拉取鏡像地址k8s.gcr.io國內無法訪問,這里指定阿里云鏡像倉庫地址kubernetes-version: 部署的k8s版本pod-network-cidr: 指定Pod網路的IP地址范圍, 選用不同的網路方案值可能不同,這里選擇Flannel網路方案, 填寫10.244.0.0/16 即可
等待執行完成,把執行日志保存下載,后面會用到</mark
[root@hadoop300 hadoop]$ kubeadm init \
> --apiserver-advertise-address=192.168.2.100 \
> --image-repository registry.aliyuncs.com/google_containers \
> --kubernetes-version v1.17.0 \
> --pod-network-cidr=10.244.0.0/16
[init] Using Kubernetes version: v1.17.0
[preflight] Running pre-flight checks
[preflight] Pulling images required for setting up a Kubernetes cluster
[preflight] This might take a minute or two, depending on the speed of your internet connection
[preflight] You can also perform this action in beforehand using 'kubeadm config images pull'
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Starting the kubelet
[certs] Using certificateDir folder "/etc/kubernetes/pki"
[certs] Generating "ca" certificate and key
[certs] Generating "apiserver" certificate and key
[certs] apiserver serving cert is signed for DNS names [hadoop300 kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local] and IPs [10.96.0.1 192.168.2.100]
[certs] Generating "apiserver-kubelet-client" certificate and key
[certs] Generating "front-proxy-ca" certificate and key
[certs] Generating "front-proxy-client" certificate and key
[certs] Generating "etcd/ca" certificate and key
[certs] Generating "etcd/server" certificate and key
[certs] etcd/server serving cert is signed for DNS names [hadoop300 localhost] and IPs [192.168.2.100 127.0.0.1 ::1]
[certs] Generating "etcd/peer" certificate and key
[certs] etcd/peer serving cert is signed for DNS names [hadoop300 localhost] and IPs [192.168.2.100 127.0.0.1 ::1]
[certs] Generating "etcd/healthcheck-client" certificate and key
[certs] Generating "apiserver-etcd-client" certificate and key
[certs] Generating "sa" key and public key
[kubeconfig] Using kubeconfig folder "/etc/kubernetes"
[kubeconfig] Writing "admin.conf" kubeconfig file
[kubeconfig] Writing "kubelet.conf" kubeconfig file
[kubeconfig] Writing "controller-manager.conf" kubeconfig file
[kubeconfig] Writing "scheduler.conf" kubeconfig file
[control-plane] Using manifest folder "/etc/kubernetes/manifests"
[control-plane] Creating static Pod manifest for "kube-apiserver"
[control-plane] Creating static Pod manifest for "kube-controller-manager"
manifests.go:214] the default kube-apiserver authorization-mode is "Node,RBAC"; using "Node,RBAC"
[control-plane] Creating static Pod manifest for "kube-scheduler"
W0125 01:09:06.409400 9705 manifests.go:214] the default kube-apiserver authorization-mode is "Node,RBAC"; using "Node,RBAC"
[etcd] Creating static Pod manifest for local etcd in "/etc/kubernetes/manifests"
[wait-control-plane] Waiting for the kubelet to boot up the control plane as static Pods from directory "/etc/kubernetes/manifests". This can take up to 4m0s
[apiclient] All control plane components are healthy after 34.503496 seconds
[upload-config] Storing the configuration used in ConfigMap "kubeadm-config" in the "kube-system" Namespace
[kubelet] Creating a ConfigMap "kubelet-config-1.17" in namespace kube-system with the configuration for the kubelets in the cluster
[mark-control-plane] Marking the node hadoop300 as control-plane by adding the label "node-role.kubernetes.io/master=''"
[mark-control-plane] Marking the node hadoop300 as control-plane by adding the taints [node-role.kubernetes.io/master:NoSchedule]
[bootstrap-token] Using token: ycni4f.ru3eby1og6qasmzc
[bootstrap-token] Configuring bootstrap tokens, cluster-info ConfigMap, RBAC Roles
[bootstrap-token] configured RBAC rules to allow Node Bootstrap tokens to post CSRs in order for nodes to get long term certificate credentials
[bootstrap-token] configured RBAC rules to allow the csrapprover controller automatically approve CSRs from a Node Bootstrap Token
[bootstrap-token] configured RBAC rules to allow certificate rotation for all node client certificates in the cluster
[bootstrap-token] Creating the "cluster-info" ConfigMap in the "kube-public" namespace
[kubelet-finalize] Updating "/etc/kubernetes/kubelet.conf" to point to a rotatable kubelet client certificate and key
[addons] Applied essential addon: CoreDNS
[addons] Applied essential addon: kube-proxy
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
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 192.168.2.100:6443 --token ycni4f.ru3eby1og6qasmzc \
--discovery-token-ca-cert-hash sha256:d46b209f85303f3bffcdacd4ecc4f3856eb4198ce41c60f871f2c0a8d6ce162f
5.3.2 配置kubectl工具
- 初始化k8s集群后kubectl是不能使用的,需要配置一下
- 從
init日志可以看出需要把/etc/kubernetes/admin.conf檔案配置成能全域訪問到即可, 可以自定配置到環境變數, 也可以按照init日志的方法進行存放
[root@hadoop300 ~]#mkdir -p $HOME/.kube # 此目錄主要保存一些k8s的配置快取之類
[root@hadoop300 ~]#sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@hadoop300 ~]#sudo chown $(id -u):$(id -g) $HOME/.kube/config # 屬主和屬組受給當前用戶
使用kubectl 查看 k8s節點的狀態
- 因為還未構建扁平化的網路方案, 所以還是master節點還是NotReady狀態
[root@hadoop300 ~]$ kubectl get node
NAME STATUS ROLES AGE VERSION
hadoop300 NotReady master 17m v1.17.0
5.4 安裝網路插件Flannel
將/proc/sys/net/bridge/bridge-nf-call-iptables 檔案設定為1(每臺服務器都要配置)
[root@hadoop300 ~]echo "1" >/proc/sys/net/bridge/bridge-nf-call-iptables
- 直接通過資源清單部署即可(master節點執行即可)
[root@hadoop300 ~]$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
之后等待一段時間后查看flannel的pod是否運行成功, 然后master節點就變為Ready狀態了
[root@hadoop300 ~]$ kubectl get pod --all-namespaces
NAME READY STATUS RESTARTS AGE
coredns-9d85f5447-2jq9g 1/1 Running 0 58m
coredns-9d85f5447-tlgbk 1/1 Running 0 58m
etcd-hadoop300 1/1 Running 1 58m
kube-apiserver-hadoop300 1/1 Running 1 58m
kube-controller-manager-hadoop300 1/1 Running 1 58m
kube-flannel-ds-gqj6v 1/1 Running 0 22m
kube-proxy-w6f49 1/1 Running 1 58m
kube-scheduler-hadoop300 1/1 Running 1 58m
# 查看節點狀態
[root@hadoop300 ~]$ kubectl get node
NAME STATUS ROLES AGE VERSION
hadoop300 Ready master 60m v1.17.0
5.5 slave節點加入集群
加入集群命令
kubeadm join --token <token> <master-ip>:<master-port> --discoverytoken-ca-cert-hash sha256:<hash>
token從上面的init日志中獲取, 如果未保存自行通過kubeadm工具獲取
如下將兩個節點hadoop301和hadoop302假如k8s集群
[hadoop@hadoop302 ~]$ kubeadm join 192.168.2.100:6443 \
--token ycni4f.ru3eby1og6qasmzc \
--discovery-token-ca-cert-hash sha256:d46b209f85303f3bffcdacd4ecc4f3856eb4198ce41c60f871f2c0a8d6ce162f
[hadoop@hadoop301 ~] # 同上
要等待一段時間, 因為slave節點拉取Flannel可能比較慢:
此時再查看3個節點的狀態都變為Ready了
[root@hadoop300 ~]$ kubectl get node -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
hadoop300 Ready master 88m v1.17.0 192.168.2.100 <none> CentOS Linux 7 (Core) 3.10.0-1160.11.1.el7.x86_64 docker://1.13.1
hadoop301 Ready <none> 13m v1.17.0 192.168.2.101 <none> CentOS Linux 7 (Core) 3.10.0-1160.11.1.el7.x86_64 docker://1.13.1
hadoop302 Ready <none> 17m v1.17.0 192.168.2.102 <none> CentOS Linux 7 (Core) 3.10.0-1160.11.1.el7.x86_64 docker://1.13.1
6 測驗K8s 之 Helloworld
- 發布應用到k8s集群中測驗效果
6.1 將應用打包成鏡像并推送
- 這里使用的是springboot應用, 里面寫了一個介面
/user - 先準備好該應用的jar包
1、撰寫DrockerFile
FROM java:8
VOLUME /tmp
ADD test.jar test.jar
ENTRYPOINT ["nohup","java","-jar","/test.jar","&"]
2、然后打包成鏡像
[root@hadoop300 tmp]# pwd
/home/hadoop/tmp
[root@hadoop300 tmp]# ll
-rw-rw-r-- 1 hadoop hadoop 98 1月 31 21:01 Dockerfile
-rw-rw-r-- 1 hadoop hadoop 19329878 1月 31 21:00 test.jar
[root@hadoop300 tmp]# docker build -t springboot01 .
[root@hadoop300 tmp]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
springboot01 latest d04728534480 4 days ago 663 MB
3、推送到Docker Hub鏡像倉庫
- 需要先注冊一個Docker Hub的賬號
[root@hadoop300 tmp]# docker login
[root@hadoop300 tmp]# docker push burukeyou/springboot01
進入官網,可以看到已經推送成功了

6.2、撰寫Pod資源清單
vim demo.yaml
apiVersion: v1
kind: Pod
metadata:
name: demo-pod01 # pod名字
namespace: default # 所屬命名空間
labels:
demo: java # 打標簽
spec:
containers:
- name: springboot01 # 容器名字
image: burukeyou/springboot01 # 鏡像地址(剛才推送的)
imagePullPolicy: IfNotPresent # 是否優先從本地拉取鏡像,如果不存在再從遠程拉取
ports:
- containerPort: 8080 # 啟動埠
6.3 發布資源
- 可以看到被部署到了hadoop302 節點,
- 通過IP訪問 介面
/user回傳字串“user: {name: 30}”
[root@hadoop300 tmp]# kubectl create -f demo.yaml
pod/demo-pod01 created
[root@hadoop300 tmp]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE
demo-pod01 1/1 Running 0 42s 10.244.1.20 hadoop302
[root@hadoop300 tmp]# curl http://10.244.1.20:8080/user
user: {name: 30}
7、Dashboard 部署(可選)
- 一個k8s集群管理的可視化網頁
- 本質也是作為一個應用部署到k8s集群, 所以也是通過
資源清單發布
7.1 通過資源清單部署
1、先把資源清單下載下來并修改
[root@hadoop300 tmp]$ wget http://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta8/aio/deploy/recommended.yaml
[root@hadoop300 tmp]# vim recommended.yaml
2、然后修改Service型別為NodePort便于外網訪問
# ------------------- Dashboard Service ------------------- #
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
type: NodePort # 修改為NodePort型別的Service
ports:
- port: 443
targetPort: 8443
nodePort: 30443 # dashboard網頁的訪問埠(自定義)
selector:
k8s-app: kubernetes-dashboard
部署dashboard
[root@hadoop300 tmp]# kubectl create -f recommended.yaml
7.2 啟動效果查看
查看 Dashboard的 Pod 和 services 是否啟動成功
[root@hadoop300 ~]# kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kubernetes-dashboard dashboard-metrics-scraper-76585494d8-mclvf 1/1 Running 0 7s
kubernetes-dashboard kubernetes-dashboard-5996555fd8-2xn6c 1/1 Running 0 8s
[root@hadoop300 ~]# kubectl get services --all-namespaces
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes-dashboard dashboard-metrics-scraper ClusterIP 10.96.115.150 <none> 8000/TCP 41s
kubernetes-dashboard kubernetes-dashboard NodePort 10.96.54.85 <none> 443:30443/TCP 42s
然后通過瀏覽器訪問, 訪問地址為: https://k8s任意節點的IP:30443/

發現要登陸, 提供了兩種方式,這里采用token登陸, 先創建一個用戶去登陸
7.3 創建管理用戶
1、撰寫創建管理員并且系結角色的資源清單 vim create-admin.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: hadoop # 自定義用戶名
namespace: kubernetes-dashboard
---
# 給用戶 hadoop 系結角色
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: hadoop # 同上
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: hadoop # 同上
namespace: kubernetes-dashboard
發布
[root@hadoop300 tmp]# kubectl apply -f create-admin.yaml
獲取Token
# 查看所有 serviceaccount 和 secrets
[root@hadoop300 tmp]# kubectl get sa,secrets -n kubernetes-dashboard
NAME SECRETS AGE
serviceaccount/default 1 61m
serviceaccount/hadoop 1 31s
serviceaccount/kubernetes-dashboard 1 61m
NAME TYPE DATA AGE
secret/default-token-wdt66 kubernetes.io/service-account-token 3 61m
secret/hadoop-token-6g859 kubernetes.io/service-account-token 3 31s
secret/kubernetes-dashboard-certs Opaque 0 61m
secret/kubernetes-dashboard-csrf Opaque 1 61m
secret/kubernetes-dashboard-key-holder Opaque 2 61m
secret/kubernetes-dashboard-token-7thdm kubernetes.io/service-account-token 3 61m
# 查看 hadoop用戶的secret的Token
[root@hadoop300 tmp]# kubectl describe secret hadoop-token-6g859 -n kubernetes-dashboard
Name: hadoop-token-6g859
Namespace: kubernetes-dashboard
Labels: <none>
Annotations: kubernetes.io/service-account.name: hadoop
kubernetes.io/service-account.uid: 6a63be78-5de6-4892-8123-6a66378df504
Type: kubernetes.io/service-account-token
Data
====
ca.crt: 1025 bytes
namespace: 20 bytes
token: eyJhbGciOiJSUzI1NiIsImtpZCI6IjFNQzA0QXZhdXJTeUtVSHhPQ3pldkZ6NWdRM285cTlPUjdYTXoxWjJ1Q00ifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJoYWRvb3AtdG9rZW4tNmc4NTkiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiaGFkb29wIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiNmE2M2JlNzgtNWRlNi00ODkyLTgxMjMtNmE2NjM3OGRmNTA0Iiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmVybmV0ZXMtZGFzaGJvYXJkOmhhZG9vcCJ9.wr7g1CmIrgv9Jj-Ap1leow8zefIzotzS4LE_qO5VNziVqEcnhCYzP2q6GnkUYR4CJt7YtEBqF6OLvlB5mHBPmFtHgtp-LiFUujScKgDdx8jdTBcVmeb39Fw_knjBuSLBOd3fqdvXumBajlwKpDQL_gYnkhc7bxn5FICYfalf1PF3AoPq8WjR2VoCDnGBB1qeaT87e6xnflScx3l6NNSEN3Bl8Ymt8WJRi4Ch0nhUZPLAXZxgO3kt1-TWHo5wASYiMW4Xwb-kPv6yAgoNTm9h6jgGqimf2InEW9rGLbnRAR0O9ZelFI6G4bE5sXtdNL_YdaVTRcmUYUKusaMpEADquQ
快捷獲取Token命令
kubectl describe secret $(kubectl get secrets -n kubernetes-dashboard | grep hadoop | awk '{print $1}') -n kubernetes-dashboard | grep token:
然后拿著token去登陸即可

問題
Dashboard在瀏覽器打不開問題
三種方法:
1、可通過火狐瀏覽器強行打開
2、如果用chrome瀏覽器chrome瀏覽器提示不安全打不開, 在當前頁面用鍵盤輸入 thisisunsafe, 不是在地址欄輸入,是直接敲鍵盤
3、重新部署Dashboard, 關閉安全驗證
a)卸載Dashboard應用
[root@hadoop300 tmp]# kubectl delete -f recommended.yaml
修改資源清單recommended.yaml 把Secret 注釋掉不創建
# ------------------- Dashboard Secret------------------- #
#apiVersion: v1
#kind: Secret
#metadata:
# labels:
# k8s-app: kubernetes-dashboard
# name: kubernetes-dashboard-certs
# namespace: kubernetes-dashboard
#type: Opaque
然后再部署dashboard
[root@hadoop300 tmp]# kubectl create -f recommended.yaml
然后自己生成 之前注釋掉的secret 即 kubernetes-dashboard-certs
# 生成dashboard.key 檔案
[root@hadoop300 cert]# openssl genrsa -out dashboard.key 2048
[root@hadoop300 cert]# ll
-rw-r--r-- 1 root root 1675 2月 4 02:27 dashboard.key
# 生成dashboard.csr 檔案
[root@hadoop300 cert]# openssl req -days 36000 -new -out dashboard.csr -key
[root@hadoop300 cert]# ll
-rw-r--r-- 1 root root 903 2月 4 02:28 dashboard.csr
-rw-r--r-- 1 root root 1675 2月 4 02:27 dashboard.key
# 生成自簽證書
[root@hadoop300 cert]# openssl x509 -req -in dashboard.csr -signkey dashboard.key -out dashboard.crt
# 使用自簽證書創建secret, 創建名為 kubernetes-dashboard-certs的 generic secret 它包含兩個條目
# dashboard.key 和 dashboard.crt
[root@hadoop300 cert] kubectl create secret generic kubernetes-dashboard-certs --from-file=dashboard.key --from-file=dashboard.crt -n kubernetes-dashboard
# 查看 該secrets 是否創建成功
[root@hadoop300 cert]# kubectl get sa,secrets -n kubernetes-dashboard
NAME SECRETS AGE
serviceaccount/default 1 23h
serviceaccount/kubernetes-dashboard 1 23h
NAME TYPE DATA AGE
secret/default-token-92k64 kubernetes.io/service-account-token 3 23h
secret/kubernetes-dashboard-certs Opaque 2 23h
secret/kubernetes-dashboard-csrf Opaque 1 23h
secret/kubernetes-dashboard-key-holder Opaque 2 23h
secret/kubernetes-dashboard-token-lcxrm kubernetes.io/service-account-token 3 23h
10、打賞

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/257065.html
標籤:其他
上一篇:2021美賽翻譯D題
下一篇:編輯安裝MySQL
