https://blog.csdn.net/qq_34556414/article/details/110000037
kubeconfig配置文件
在node節點上可以執行kubectl命令嗎?
[root@k8s-node1 ~]# kubectl get node
The connection to the server localhost:8080 was refused - did you specify the right host or port?
localhost:8080 這個端口是k8s api(kube-apiserver非安全端口)的端口,在master上面可以執行成功其實走的是配置文件。但是在node上連接的是本地的非安全端口。
其實還有一個對外端口是6443,這個是kube-apiserver監聽的,masterip:6443安全端口
[root@k8s-master ~]# netstat -tpln | grep 6443
tcp6 0 0 :::6443 :::* LISTEN 92617/kube-apiserve
什么叫安全端口,什么叫非安全端口
kube-apiserver兩個端口:
- localhost:8080 非安全端口(不需要認證,沒有加入認證機制),是kubectl默認先連接8080,如果你配置kubeconfig(.kube/config)就直接走這個配置連接的安全端口(在master上沒有8080端口,走的是kubeconfig)
- masterip:6443 安全端口 ,提供了內部授權的機制,比如登入網站想要輸入用戶名密碼才能登入。
kubeadm安裝的默認禁用了8080端口,二進制安裝默認是啟用的,他們兩個區別在於有沒有加入身份認證,即鑒權。這個文件在這個目錄下面,在root家目錄下面。這個配之文件是在安裝最后一步拷貝過來的
[root@k8s-master ~]# ls .kube/
cache config
最后,拷貝連接k8s集群的認證文件到默認路徑下
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
可以看到讀取到的是該配置文件
[root@k8s-master .kube]# ls
cache config
[root@k8s-master .kube]# mv config config.bak
[root@k8s-master .kube]# kubectl get node
The connection to the server localhost:8080 was refused - did you specify the right host or port?
[root@k8s-master .kube]# mv config.bak config
[root@k8s-master .kube]# kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master Ready master 3d7h v1.19.0
k8s-node1 Ready <none> 3d6h v1.19.0
k8s-node2 Ready <none> 3d6h v1.19.0
關閉8080端口就是希望你使用配置文件去連接安全端口,這樣是安全的,非安全端口是絕對不能對外提供服務的,如果對外提供服務別人掃描到你api做一些惡意的操作,整個集群可能就掛了,即使有這個端口也是監聽在本地,也就是只能這台機器去連接。
讓Node使用kubectl命令
現在知道了kubectl怎么連接集群和管理集群,它是通過kubeconfig這個文件連接過去的。這個文件到底是怎么樣生成的呢?
[root@k8s-master ~]# scp /root/.kube/config root@192.168.179.103:~
[root@k8s-node1 ~]# ls
anaconda-ks.cfg config
[root@k8s-node1 ~]# kubectl get node --kubeconfig=config
NAME STATUS ROLES AGE VERSION
k8s-master Ready master 3d7h v1.19.0
k8s-node1 Ready <none> 3d6h v1.19.0
k8s-node2 Ready <none> 3d6h v1.19.0
kubeconfig生成與文件結構
kubeconfig這個文件是通過kubectl config指令生成的
clusters:
- cluster:
certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM1ekNDQWMrZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRJd01URXhOVEEyTlRZeU5sb1hEVE13TVRFeE16QTJOVFl5Tmxvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBSmZsCmtaVVhUcVJ3ZjJVeDdqS1pjQURvaHV1aHNXcHAvK2NIOEF1MVpmR3JqN0lTb3VoelVISkZ5cGR5ekdoTDFBRHgKMTkxVlVCN1ZCWlk4cXBDRHYyRnZvWkRFbFVYR1JrTFFDT0lxc1hOVUt3ZU0xdnJqZnpZVW5ZNGN6NDhKNDdpTgpnUjJHRGtsWUlrZFpGZEU1ekN2eitldEtEVVUzdE5GV0djL00yZFE0NUIxNGZlTldpTUR3T0l3dTBSSWRvYmpnCndmSnhoVlJHMmgzdEplL0RpUjQ2cXI1NEdMVUU2VXNDUGJvZ0JxNTVBakt2c2NiOWUzeGdzMVJhZW1BdFZhd08KSFNjRkRDYWhBZDVPUlgzMlIzSGNoRnY2QmFwczgyb0dqUDBLOEY1RXNQWkFYQXFoK3c0UTFMRWQ2aHRuQWhyWAoxcmJ5cTF4eUNESnhhbENaSHBjQ0F3RUFBYU5DTUVBd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZPZXFad29TeUxrVDVKWXlRNURMamUzRFRHUjJNQTBHQ1NxR1NJYjMKRFFFQkN3VUFBNElCQVFCemtMRXMzUGhIN08wYWs5VWlTbFhDVTljK1RoYlZaTmZVUStKS1JpQU5KQys5Qm8vZApLdUlLYWhxQlE5UkprSk53TmVwT0NJOWxzcGJ4TGtHK3ArYktHV29Yb25CME5RdnZoZTRQd0p0dmdUcGlhVmVYCmNLejhUMDBRT1YyRzR0WEtmaTViK0dvZDA3NktlZm4zbm00U0l1VDh6bmNDclUxeHRpQTRSU3RQRVZZZTRQalAKY2p6MHJVS3BnTmhJL0lYc2JPVDNYV0hFNE4vU0VLcmtIYkRJNFpEUGRYa2gxd3piM1FZODFuZTh1enBNQVJ5VwpLbkx6R1NRaGJ0WTlWRUZkdlhGK0wreWFrQjcrR29xa1lJa1BNdURveFRoeTBuMFJjZStSTUhtZkFQSEh2RDFyCjdSNC9xdlpBLzA4Q0hxb3ZDcCsxUzNXbFE5WE5MRzE3TWExTAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
server: https://192.168.179.102:6443
name: kubernetes
在上面部分是配置集群的,即要連接的k8s集群主節點IP是多少,並且里面包含了相關證書。
Context指定上下文,和指定當前使用哪個上下文。
在配置文件當中可能會存在多個集群,現在只有一個集群是我剛剛搭建的。你再搭建一個集群是可以將兩個配置文件進行合並,兩個配置文件合並在一個配置文件里面。合並在一起就可以使用這一個配置文件去切換着連接兩個不通的集群,切換的操作實際上就是指定上下文的操作。(上下文引用了集群信息,和客戶端信息)
兩個文件合並為一個文件,這個得修改要不沖突
name: kubernetes 修改為 name: kubernetes1
users:
- name: kubernetes-admin 修改為 kubernetes-admin1
name: kubernetes-admin1@kubernetes1 這樣就切換到另外一個集群了,最后是客戶端的認證,即客戶端以什么身份連接過來的,上下文就是資源的關聯。
總結
什么是 kubectl?
官方文檔中介紹 kubectl 是:
Kubectl 是一個命令行接口,用於對 Kubernetes 集群運行命令。Kubectl 的配置文件在$HOME/.kube 目錄。我們可以通過設置 KUBECONFIG 環境變量或設置命令參數--kubeconfig 來指定其他位置的 kubeconfig 文件。
也就是說,可以通過 kubectl 來操作 K8S 集群,基本語法:
使用以下語法 kubectl 從終端窗口運行命令:
kubectl [command] [TYPE] [NAME] [flags]
其中 command、TYPE、NAME 和 flags 分別是:
command:指定要對一個或多個資源執行的操作,例如 create、get、describe、delete。
TYPE:指定資源類型。資源類型不區分大小寫,可以指定單數、復數或縮寫形式。例如,以下命令輸出相同的結果:
```shell
kubectl get pod pod1
kubectl get pods pod1
kubectl get po pod1
- `NAME`:指定資源的名稱。名稱區分大小寫。如果省略名稱,則顯示所有資源的詳細信息 `kubectl get pods`。
在對多個資源執行操作時,您可以按類型和名稱指定每個資源,或指定一個或多個文件:
- 要按類型和名稱指定資源:
- 要對所有類型相同的資源進行分組,請執行以下操作:`TYPE1 name1 name2 name<#>`。
例子:`kubectl get pod example-pod1 example-pod2`
- 分別指定多個資源類型:`TYPE1/name1 TYPE1/name2 TYPE2/name3 TYPE<#>/name<#>`。
例子:`kubectl get pod/example-pod1 replicationcontroller/example-rc1`
- 用一個或多個文件指定資源:`-f file1 -f file2 -f file<#>`
- [使用 YAML 而不是 JSON](https://kubernetes.io/zh/docs/concepts/configuration/overview/#general-config-tips) 因為 YAML 更容易使用,特別是用於配置文件時。
例子:`kubectl get -f ./pod.yaml`
- `flags`: 指定可選的參數。例如,可以使用 `-s` 或 `-server` 參數指定 Kubernetes API 服務器的地
就如何使用 kubectl 而言,官方文檔已經說得非常清楚。不過對於新手而言,還是需要解釋幾句:
kubectl 是 K8S 的命令行工具,並不需要 kubectl 安裝在 K8S 集群的任何 Node 上,但是,需要確保安裝 kubectl 的機器和 K8S 的集群能夠進行網絡互通。
kubectl 是通過本地的配置文件來連接到 K8S 集群的,默認保存在$HOME/.kube 目錄下;也可以通過 KUBECONFIG 環境變量或設置命令參數--kubeconfig 來指定其他位置的 kubeconfig 文件【官方文檔】。
怎么配置 kubectl?
第一步,必須准備好要連接/使用的 K8S 的配置文件,筆者給出一份杜撰的配置:
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: thisisfakecertifcateauthoritydata00000000000
server: https://1.2.3.4:1234
name: cls-dev
contexts:
- context:
cluster: cls-dev
user: kubernetes-admin
name: kubernetes-admin@test
current-context: kubernetes-admin@test
kind: Config
preferences: {}
users:
- name: kubernetes-admin
user:
token: thisisfaketoken00000
解讀如下:
clusters記錄了 clusters(一個或多個 K8S 集群)信息:
name是這個 cluster(K8S 集群)的名稱代號
server是這個 cluster(K8S 集群)的訪問方式,一般為 IP+PORT
certificate-authority-data是證書數據,只有當 cluster(K8S 集群)的連接方式是 https 時,為了安全起見需要證書數據
users記錄了訪問 cluster(K8S 集群)的賬號信息:
name是用戶賬號的名稱代號
user/token是用戶的 token 認證方式,token 不是用戶認證的唯一方式,其他還有賬號+密碼等。
contexts是上下文信息,包括了 cluster(K8S 集群)和訪問 cluster(K8S 集群)的用戶賬號等信息:
name是這個上下文的名稱代號
cluster是 cluster(K8S 集群)的名稱代號
user是訪問 cluster(K8S 集群)的用戶賬號代號
current-context記錄當前 kubectl 默認使用的上下文信息
kind和apiVersion都是固定值,用戶不需要關心
preferences則是配置文件的其他設置信息,筆者沒有使用過,暫時不提。
第二步,給 kubectl 配置上配置文件。
--kubeconfig參數。第一種辦法是每次執行 kubectl 的時候,都帶上--kubeconfig=${CONFIG_PATH}。給一點溫馨小提示:每次都帶這么一長串的字符非常麻煩,可以用 alias 別名來簡化碼字量,比如alias k=kubectl --kubeconfig=${CONFIG_PATH}。
KUBECONFIG環境變量。第二種做法是使用環境變量KUBECONFIG把所有配置文件都記錄下來,即export KUBECONFIG=$KUBECONFIG:${CONFIG_PATH}。接下來就可以放心執行 kubectl 命令了。
$HOME/.kube/config 配置文件。第三種做法是把配置文件的內容放到$HOME/.kube/config 內。具體做法為:
如果$HOME/.kube/config 不存在,那么cp ${CONFIG_PATH} $HOME/.kube/config即可;
如果如果 $HOME/.kube/config已經存在,那么需要把新的配置內容加到 $HOME/.kube/config 下。單單只是cat ${CONFIG_PATH} >> $HOME/.kube/config是不行的,正確的做法是:KUBECONFIG=$HOME/.kube/config:${CONFIG_PATH} kubectl config view --flatten > $HOME/.kube/config 。解釋下這個命令的意思:先把所有的配置文件添加到環境變量KUBECONFIG中,然后執行kubectl config view --flatten打印出有效的配置文件內容,最后覆蓋$HOME/.kube/config 即可。
請注意,上述操作的優先級分別是 1>2>3,也就是說,kubectl 會優先檢查--kubeconfig,若無則檢查KUBECONFIG,若無則最后檢查$HOME/.kube/config,如果還是沒有,報錯。但凡某一步找到了有效的 cluster,就中斷檢查,去連接 K8S 集群了。
第三步:配置正確的上下文
按照第二步的做法,如果配置文件只有一個 cluster 是沒有任何問題的,但是對於有多個 cluster 怎么辦呢?到這里,有幾個關於配置的必須掌握的命令:
kubectl config get-contexts。列出所有上下文信息。
kubectl config current-context。查看當前的上下文信息。其實,命令 1 線束出來的*所指示的就是當前的上下文信息。
kubectl config use-context ${CONTEXT_NAME}。更改上下文信息。
kubectl config set-context ${CONTEXT_NAME}|--current --${KEY}=${VALUE}。修改上下文的元素。比如可以修改用戶賬號、集群信息、連接到 K8S 后所在的 namespace。
關於該命令,還有幾點要啰嗦的:
config set-context可以修改任何在配置文件中的上下文信息,只需要在命令中指定上下文名稱就可以。而--current 則指代當前上下文。
上下文信息所包括的內容有:cluster 集群(名稱)、用戶賬號(名稱)、連接到 K8S 后所在的 namespace,因此有config set-context嚴格意義上的用法:
kubectl config set-context [NAME|--current] [--cluster=cluster_nickname] [--user=user_nickname] [--namespace=namespace] [options]
(備注:[options]可以通過 kubectl options 查看)
綜上,如何操作 kubectl 配置都已交代。
————————————————
版權聲明:本文為CSDN博主「富士康質檢員張全蛋」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_34556414/article/details/110000037