《kubernetes權威指南》讀書筆記
本文只是隨便記錄k8s一些常用命令列、一些配置、一些基本概念。後期再進行整理
【概念】
1、為啥會出現pasue容器?
1)用pasue容器的存活狀態標誌整個容器組的狀態
2)一個pod裡的多個業務容器可共享Pause容器的IP、共享Pause容器掛接的Volume。
k8s為每個pod都分配了一個唯一的IP地址,稱之為PodIp。一個Pod裡的多個容器共享PodIp地址。
因此在k8s中,一個Pod裡的容器與另外主機上的Pod容器能夠直接通訊(通常採用虛擬二層技術,例如Flannel、ovs)
2、三種IP
NodeIP: Node節點的Ip地址。物理網絡卡上的IP。
Pod Ip: Pod的Ip地址。docker engine根據docker0網橋的ip地址段進行劃分的。
ClusterIp: Service的Ip地址,屬於kubernetes管理的,無法ping通。
3、三種Port
containerPort:容器暴露的埠。也就是說可以通過該容器埠,訪問對應的服務。
targetPort: 當service中指定的埠和pod中暴露出的埠不一致時,需要用targetPort指定出pod暴露出的埠
nodePort: 出現在Service中,指定外部機器可通過該物理埠,訪問服務。其中type必須是NodePort
舉例說明:
apiVersion: v1
kind: Servicemetadata:
name: myweb
spec:
type: NodePort
clusterIP: 10.254.202.240
ports:
- port: 8085 // service抽象出來的埠
targetPort: 8080 // pod容器短埠
nodePort: 30001 //物理埠
selector:
app: myweb
訪問方式:
1)仍然通過host主機Ip:30001訪問
2)可以在master節點通過curl clusterIP:8085訪問,如果有代理則需要設定noproxy引數例如
curl http://10.254.202.240:8080 -v --noproxy 10.254.202.240
3、kubernetes網路模型:Ip-per-Pod。以pod作為最小單位進行ip劃分。也就是說Pod裡面的所有容器對外表現都是同一個ip地址。pod裡面共享namespace空間。
優點:共享資源,效能會好一些。相當於一個虛擬機器多個程序,可以使用localhost通訊
缺點:隔離性被破壞,會引入不安全因素
【命令】
kubectl get pods -- 獲取pod
kubectl get rc -- 獲取rc
kubectl get svc -- 獲取服務
kubectl get all --all-namespaces -- 獲取所有內容(前三種綜合)
kubectl exec myweb-zkm6k -it /bin/bash 進入pod(適合一個pod中只有一個容器)
kubectl exec -it <Pod名稱> -c <容器名稱> /bin/bash 進入pod中指定容器
kubectl create -f 檔案.yaml -- 用於建立各類服務
kubectl delete -f 檔案.yaml -- 用於刪除各類服務
kubectl describe node node名稱 -- 用於檢視node相關資訊
kubectl scale rc redis-slave --replicas = 3 ---用於擴充套件或者收縮pod 設定副本數量
kubectl get endpoints
kubectl get namespaces
kubectl expose rc webapp --- 根據rc(webapp)生成其service
echo "source <(kubectl completion bash)" >> ~/.bashrc --- 設定kubectl自動補全命令
【外掛】
Heapster -- 效能資料採集外掛
跨主機容器間網路通訊:
Flannel 、Open vSwitch、Weave、Calico
Etcd -- 分散式資料儲存
【配置】
apiVersion包括:v1,extensions/v1beta1
kind:包括
kind | v1 | extensions/v1beta1 | autoscaling/v1 | 備註 |
ReplicationController | √ | |||
Pod | √ | |||
Service | √ | |||
ReplicaSet | √ | |||
Deployment | √ | |||
HorizontalPodAutoscaler | √ | |||
PersistentVolume | √ | 網路永久儲存定義 | ||
Namespace | √ | 名稱空間定義,用於隔離租戶間資源 | ||
DaemonSet | √ | 確保每個Node上僅有一份Pod的副本 | ||
Endpoints | √ |
yaml檔案模板:
apiVersion: v1 #指定api版本,此值必須在kubectl apiversion中
kind: Pod #指定建立資源的角色/型別
metadata: #資源的元資料/屬性
name: web04-pod #資源的名字,在同一個namespace中必須唯一
labels: #設定資源的標籤,詳情請見http://blog.csdn.net/liyingke112/article/details/77482384
k8s-app: apache
version: v1
kubernetes.io/cluster-service: "true"
annotations: #自定義註解列表
- name: String #自定義註解名字
spec:#specification of the resource content 指定該資源的內容
restartPolicy: Always #表明該容器一直執行,預設k8s的策略,在此容器退出後,會立即建立一個相同的容器
nodeSelector: #節點選擇,先給主機打標籤kubectl label nodes kube-node1 zone=node1
zone: node1
containers:
- name: web04-pod #容器的名字
image: web:apache #容器使用的映象地址
imagePullPolicy: Never #三個選擇Always、Never、IfNotPresent,每次啟動時檢查和更新(從registery)images的策略,
# Always,每次都檢查
# Never,每次都不檢查(不管本地是否有)
# IfNotPresent,如果本地有就不檢查,如果沒有就拉取
command: ['sh'] #啟動容器的執行命令,將覆蓋容器中的Entrypoint,對應Dockefile中的ENTRYPOINT
args: ["$(str)"] #啟動容器的命令引數,對應Dockerfile中CMD引數
env: #指定容器中的環境變數
- name: str #變數的名字
value: "/etc/run.sh" #變數的值
resources: #資源管理,請求請見http://blog.csdn.net/liyingke112/article/details/77452630
requests: #容器執行時,最低資源需求,也就是說最少需要多少資源容器才能正常執行
cpu: 0.1 #CPU資源(核數),兩種方式,浮點數或者是整數+m,0.1=100m,最少值為0.001核(1m)
memory: 32Mi #記憶體使用量
limits: #資源限制
cpu: 0.5
memory: 32Mi
ports:
- containerPort: 80 #容器開發對外的埠
name: httpd #名稱
protocol: TCP
livenessProbe: #pod內容器健康檢查的設定,詳情請見http://blog.csdn.net/liyingke112/article/details/77531584
httpGet: #通過httpget檢查健康,返回200-399之間,則認為容器正常
path: / #URI地址
port: 80
#host: 127.0.0.1 #主機地址
scheme: HTTP
initialDelaySeconds: 180 #表明第一次檢測在容器啟動後多長時間後開始
timeoutSeconds: 5 #檢測的超時時間
periodSeconds: 15 #檢查間隔時間
#也可以用這種方法
#exec: 執行命令的方法進行監測,如果其退出碼不為0,則認為容器正常
# command:
# - cat
# - /tmp/health
#也可以用這種方法
#tcpSocket: //通過tcpSocket檢查健康
# port: number
lifecycle: #生命週期管理
postStart: #容器執行之前執行的任務
exec:
command:
- 'sh'
- 'yum upgrade -y'
preStop:#容器關閉之前執行的任務
exec:
command: ['service httpd stop']
volumeMounts: #詳情請見http://blog.csdn.net/liyingke112/article/details/76577520
- name: volume #掛載裝置的名字,與volumes[*].name 需要對應
mountPath: /data #掛載到容器的某個路徑下
readOnly: True
volumes: #定義一組掛載裝置
- name: volume #定義一個掛載裝置的名字
#meptyDir: {}
hostPath:
path: /opt #掛載裝置型別為hostPath,路徑為宿主機下的/opt,這裡裝置型別支援很多種
【其他雜項】
1、Node排程 可以指定排程到某節點
NodeSelector -- 比較固定,相對簡單
NodeAffinity -- 更加靈活,支援邏輯運算:In NotIn Exists DoesNotExist(不存在) Gt Lt等
2、k8s為什麼會抽象出一層Service呢?容器已經啟動,為什麼不使用PodIp+埠方式呢?
1)一個pod中可能會有多個容器,通過podip+埠方式訪問,且不同node,分配的podip可能會重複。因此不是很方便。
2)容器本身是分散式部署,因此前端需要一個類似負載均衡器的東西,來進行請求的分發。
所以抽象出一個Service是非常合適的。
3、k8s Service提供排程的後端Pod的負載均衡方式:輪訓方式(RoundRobin)和會話保持方式(SessionAffinity)
SessionAffinity方式指的是第一次排程到哪個pod上,以後同一會話均轉到這個pod中
4、pod中容器必須是前端程序,如果前端程序結束則pod就結束。因此設定command欄位執行的命令為死迴圈:
command: ["/bin/bash","-c","while true; do sleep 5d;done"]