⑴ k8s常用命令
docker run busybox echo "hello world"
docker run --name kubia-container -p 8080:8080 -d kubia
docker build -t kubia .
docker images
docker ps
docker exec -it kubia-container bash
docker stop kubia-container
docker rm kubia-container
docker tag kubia luksa/kubia
docker login
docker push luksa/kubia
docker logs <container id>
kubectl run kubia --image=luksa/kubia --port=8080
kubectl expose pod kubia <--type=LoadBalancer --name kubia-http> (type指定svc類型默認clusterip,name指定svc名稱)
kubectl get ... (#-o wide列出pod ip和運行節點 #-o yaml輸出格式 #--show-lables列出標簽#-L列出指定標簽)
kubectl describe ...
kubectl cluster-info
kubectl explain pod
kubectl explain pod.spec
kubectl create -f kubia-manual.yaml
kubectl logs <pod> -c <container id> (#--previous獲取奔潰容器的日誌)
kubectl port-forward kubia-manual 8888:8080
參考: https://stackoverflow.com/questions/33517646/unable-to-do-port-forwarding-socat-not-found-kubernetes-on-docker
kubectl label po <pod name> <key=value> #添加
kubectl label po <pod name> <key=value> --overwrite #修改
kubectl annotate
kubectl delete po <pod name> (--all 所有poad)
kubectl delete po -l
kubectl delete ns #刪除整個命名空間
kubectl delete all --all (刪除所有資源)
128+9(SIGKILL) 進程強制終止,此時會創建一個腔搏全新容器
128+15(SIGTERM)
initalDelaySeconds 設置延遲來說明應用程序啟動時間
kubectl delete rc kubia --cascade=false
kubectl get nodes -o jsonpath='{.items[*].status.addresses[?(@.type=="ExternalIP")].address}'
export CURL_CA_BUNDLE=/var/run/secrets/kubernetes.io/伍渣祥serviceaccount/ca.crt
TOKEN= TOKEN" https://kubernetes
kubectl create clusterrolebinding permissive-binding --clusterrole=cluster-admin --group=system:serviceaccounts
kubectl apply -f nginx-test.yaml
kubectl delete -f nginx-test.yaml #刪除YAML文件中定義的資梁輪源
kubectl get deployment nginx-test -o yaml
kubectl create deployment test --image=nginx:1.7.9 --dry-run=client -o yaml > nginx.yaml
kubectl api-versions #查看K8S所支持API版本
kubectl api-resources #查看K8S所有資源類型
kubectl explain pods #發現api對象欄位
kubectl explain pods.spec#了解各個屬性更多信息
kubectl apply -f pod-demo.yaml
kubectl get pods #查看容器是否運行,正常情況應該是Running
kubectl get pods -o wide #查看pod詳細信息,包含了IP、所屬Node等
kubectl get pods --show-labels #查看資源標簽
kubectl get pods -L creation_method,env #將creation_method,env標簽展示在列表上
kubecl label pods kubia-manual creation_method=manual #添加標簽
kubecl label pods kubia-manual env=debug --overwrite #修改標簽--overwrite選項
kubectl get namespaces #查看namespace
kubectl get pods -n kube-system #顯示指定namespace的pod
kubectl describe pods pod-demo
kubectl delete pods <pod name> #按名稱刪除
kubectl delete pods -l <label> #按標簽刪除<namespace> #刪除整個命名空間來刪除pod
kubectl delete pods --all #刪除命名空間中的所有pod
kubectl delete all --all #刪除命名空間中的幾乎所有資源,pod rc svc
kubectl delete rc kubia --cascade=false #只刪除 ReplicationController 並保待 pod 運行
kubectl logs mypod
kubectl logs mypod --previous #查看前一個容器的日誌
退出狀態碼是兩個數字的總和:128+x, 其中x是終止進程的信號編號
http://kubernetes.io/docs/user-guide/jsonpath
主要用於Pod調度和驅逐,優先順序越低的QOS越容易被驅逐。不同QOS優先順序不同,使用kubectl describe命令可以查看Qos Class:
· BestEffort:盡可能的為Pod分配資源,默認不進行requests設置就是該QOS,優先順序最低
· Burstable:資源可波動,requests小於limit的值就是該QOS,推薦
· Guaranteed:完全可保障資源,必須使用requests和limit定義內存和CPU兩項資源並且相等,優先順序最高
由於每個節點都有 一個唯 一標簽 , 其中 鍵為kubernetes.io/hostname,值為該 節點的 實際主機名
kubectl annotate pods <podname> <key=value>
⑵ K8S安裝和創建集群終極教程(單master多worker)
本文會以 最簡單 、 最直接 、 最完整 的方式記錄kubernetes(下面統稱K8S)單master多工作節點(worker nodes)的集群步驟
首先要簡單了解一下本文的3個核心概念:
內存建議至少4G
問:如何查看主機名?
答:執行命令hostname
問:如何修改主機名?
答:永久生效的做法:執行命令vi /etc/hostname,把第一行去掉(不能注釋掉,要去掉),然後重新寫上自定義的主機名(注意命名規范),保存並重啟後生效;
臨時生效的做法:執行以下命令
問:如何查看MAC地址?
答:執行命令ip link,然後看你的第一網卡
問:如何查看proct_uuid?
答:執行命令sudo cat /sys/class/dmi/id/proct_uuid
注意:30000-32767這個埠范圍是我們創建服務的埠必須要設置的一個范圍(如果設置范圍以外的會有限制提示並創建失敗),這是K8S規定的。
另外,如果你要直接關閉防火牆可以執行
⑥必須禁用Swap
Swap total大於0,說明Swap分區是開啟的
問:如何關閉Swap?
答:編輯文件/etc/fstab,在swap行前面加上#號注釋, 保存並重啟伺服器
再次查看分區狀態,已生效
常見的容器引擎(Container runtime,簡稱runtime):
本文使用的容器引擎是Docker
安裝完成後查看版本:
當出現可能跟Docker引擎相關的奇怪異常時可以嘗試把Docker卸載干凈並重新安裝,但一定要注意鏡像、容器、卷或配置文件這些是否需要備份。
下面記錄卸載Docker引擎的步驟:
①卸載 Docker Engine、CLI 和 Containerd 包:
②主機上的映像、容器、卷或自定義配置文件不會自動刪除。刪除所有鏡像、容器和卷:
③配置文件如果有不合法的字元時會導致啟動失敗,我們需要將其刪除然後重建
此時Docker引擎已卸載干凈
官網用的是谷歌的yum源,因為國內是連不上的,所以這里替換成阿里提供的yum源
①安裝
從安裝信息中可以看到版本號是1.22
Installing:
kubeadm x86_64 1.22.4-0 kubernetes 9.3 M
kubectl x86_64 1.22.4-0 kubernetes 9.7 M
kubelet x86_64 1.22.4-0 kubernetes 20 M
②啟動
這就是一個驅動程序,注意cgroup和cgroupfs不要混淆了
引用官方的一段話
「由於 kubeadm 把 kubelet 視為一個系統服務來管理,所以對基於 kubeadm 的安裝, 我們推薦使用 systemd 驅動,不推薦 cgroupfs 驅動。」
kubeadm默認是使用systemd 驅動,而我們的Docker默認驅動是cgroupfs(docker info可以查看),所以需要將Docker的驅動改成systemd
①編輯Docker配置文件
②重啟Docker服務
再次docker info查看驅動信息已變成了systemd
工作節點(worker nodes)的最小配置就到這里了
①鏡像源參數說明
默認情況下, kubeadm 會從 k8s.gcr.io 倉庫拉取鏡像,國內是拉不了的。官方文檔明確表示允許你使用其他的 imageRepository 來代替 k8s.gcr.io。
--image-repository 你的鏡像倉庫地址
接下來我找了一些國內的鏡像源,並簡單做了下分析
綜合上述統計,我選擇阿里雲的鏡像源
②ip地址范圍參數說明
--pod-network-cidr =192.168.0.0/16
注意:如果192.168.0.0/16已經在您的網路中使用,您必須選擇一個不同的pod網路CIDR,在上面的命令中替換192.168.0.0/16。
集群初始化命令:
因為我用的是演示機器,所以這里把完整的執行信息都貼出來方便查閱,平時工作中一定要注意保護好敏感的信息(我的ip地址范圍是自定義的便於下面的功能演示,另外初次init需要下載鏡像文件,一般需要等幾分鍾)
如上所示,集群初始化成功,此時一定要注意看上面執行結果最後的那部分操作提示,我已用標明了初始化成功後還需要執行的3個步驟
注意:如果init成功後發現參數需要調整,可以執行kubeadm reset,它的作用是盡最大努力恢復kubeadm init 或者 kubeadm join所做的更改。
To start using your cluster, you need to run the following as a regular user:
翻譯:開始使用集群前,如果你是普通用戶(非root),你需要執行以下的命令:
Alternatively, if you are the root user, you can run:
翻譯:或者,如果你使用的是root,你可以執行以下命令:
(注意:export只是臨時生效,意味著每次登錄你都需要執行一次)
網路配置配的就是Pod的網路,我的網路插件選用calico
cidr就是ip地址范圍,如果您使用 pod CIDR 192.168.0.0/16,請跳到下一步。
但本文中使用的pod CIDR是192.100.0.0/16,所以我需要取消對清單中的 CALICO_IPV4POOL_CIDR 變數的注釋,並將其設置為與我選擇的 pod CIDR 相同的值。(注意一定要注意好格式,注意對齊)
可根據需求自定義清單,一般不需要的就直接跳過這步
在所有的工作節點上執行join命令(復制之前初始化成功後返回的加入集群命令到所有的工作節點執行即可)
master上查看所有節點的狀態
到這里集群已經創建完成
最後我再安裝K8S的可視化界面kubernetes-dashboard,方便我們日常使用
①下載yaml文件
②修改yaml文件,新增type和nodePort,使服務能夠被外部訪問
③安裝並查看運行情況
④新建用戶
文件創建完成後保存並apply
⑤獲取Token,用於界面登錄
⑥登錄dashboard
192.168.189.128是我的master伺服器ip,另外要注意必須使用https,並且不能使用ie內核模式
復制⑤生成的token到輸入框,點擊登錄
dashboard安裝配置完成
問:如何在查看資源情況?
答:在master上執行以下命令可查看資源情況(-o wide是顯示更詳細的信息),
①查看所有節點
②查看所有命名空間
③查看命名空間下的pod
④查看所有命名空間的pod
⑤實時查看查看命名空間下的pod運行情況
問:kubeadm join 出現異常[ERROR Port-10250]: Port 10250 is in use,如何解決?
答:這是因為你之前join失敗過了,需要先執行kubeadm reset再重新join
問:虛擬機上測試時網卡突然消失如何解決(題外問題記錄)?
答:
①確認丟失的網卡信息,ens開頭(可選步驟)
ifconfig -a
②執行以下命令解決
問:如何查看K8S版本?
答:kubectl version
問:join命令忘記或者過期了怎麼辦?
答:
生成永不過期的
生成時效24小時的
問:Pod不斷重啟並且無其它報錯信息時怎麼辦?
答:這種情況通常是因為你的集群中只有master,沒有worker節點,master的創建默認是有污點的,即不允許調度新的Pod,如果你需要(當然這並不推薦),就需要刪除 master 上的污點。刪除污點可以執行以下命令,
它應該返回以下內容。
⑶ k8s常用命令
命令行 敲出的指令分為2種,
資源管理方式分類
直接使用命令去操作k8s資源,命令和參數一起出現
通過命令和配置文件去操作作k8s資源,命令還是那個命令,只不過參數都放在配置文件裡面
使用apply創建資源,
說明
在master節點執行以下命令即可刪除
還需要在work節點上執行以下命令來清空ini配置
先在主節點創建令牌
然後在需要加入集群的節點中執行令牌,注意這里的命令是通過 kubeadm token create --print-join-command 命令返回的結果
說明
記住,名稱中不能用下劃線 _ ,可以用橫行 - 第一種創建方式–命令行創建
第二種創建方式–命令行 + 配置文件
創建一個名為namespace-dev.yaml的文件,內容如下(注意大小寫,kind的頭字母必須大寫)
然後偶執行命令進行創建
需要注意的是,刪除後,當前命名空間下的pod、deployment、 container 也會一起刪掉
第一種–使用命令刪除
第二種–使用配置文件刪除
說明
獲取所有namespace的pod並監視資源變動
加上 -w 表示監視資源變動信息,此時命令行進入阻塞狀態,如果pod有變化將會馬上呈現出來;
其他參數
因為pod裡面至少要有一個容器,所以pod是和容器一起創建的,新建一個文件 pod.ymal ,內容如下
然後執行命令並指定配置文件進行創建
以下示例是為pod資源打標簽,這種方式是和pod一起創建的,新建一個配置文件 label.yaml
執行命令創建pod
適合更新label值,前提是label的key必須已存在;
刪除key為lebelKey的標簽
pod控制器有很多種,我們這里就用deployment
使用以下run命令運行一個nginx,deployment名稱為 app=run-cmd-nginx-deploy-3
通過以下命令可以看到,會自動生成一個 app=run-cmd-nginx-deploy-3 的標簽
新建一個deployment.yaml文件,內容如下
需要注意的是,一旦刪除pod控制器,此pod控制器下的所有pod和容器也會一並刪除;
默認創建的pod是只能對內訪問的,所以需要創建一個對外的訪問埠,創建一個service其實就是暴露對外的訪問埠
說明
創建好service之後,查看service信息,可以看到,暴露的埠為:30474,
新建一個service.ymal文件,內容如下
以下三種用法都可以
查詢pod控制器和pod
Endpoint是kubernetes中的一個資源對象,存儲在etcd中,用來記錄一個service對應的所有pod的訪問地址,它是根據service配置文件中selector描述產生的。
一個Service由一組Pod組成,這些Pod通過Endpoints暴露出來,Endpoints是實現實際服務的端點集合。換句話說,service和pod之間的聯系是通過endpoints實現的。
每創建一個service,k8s會自動創建一個同名的 Endpoint出來
如果是由service創建出來的endpoints,刪除後會馬上創建出一個同名的endpoint出來,如果要刪除必須先刪除service
因為每次創建一個service,k8s會自動創建一個同名的 Endpoint出來,所我們直接創建service就可以了
--help 用來查看幫助文檔,如果你不知道某個命令怎麼使用了,就可以用 --help 查詢命令的用法
explain用來查看配置文件的 資源結構,如果不知道配置文件中的資源用有哪些結構,那麼就可以使用explain命令來查看