k8s向集群外部暴露端口的3種方式:
1.service->nodePort :僅暴露一個宿主機端口,用於集群外部訪問,因為此操作被寫入各個節點的iptables或ipvs規則當中,可以用任意一個節點的IP+端口號訪問。
2.hostNetwork :暴露宿主機IP,只可以通過此宿主機IP訪問,慎重使用。
3.hostPort->contianerPort :宿主機和容器的端口映射,只能訪問被指定的容器和宿主機。
kbectl的命令可分為三類:
1.陳述式命令-->(指明對象和要求)
2.陳述式對象配置--> create(用json或yaml格式定義我們期望狀態的資源清單)
3.聲明式對象配置--> apply (可以對一個yaml資源清單多次進行apply)
pod相當於容器的有一個外殼,對容器的抽象形成的pod,一個pod可以運行1個到多個容器,並且,同一pod下的容器共享一組網絡名稱空間
pod中即使看上去是運行一個容器,其實不然,它還包括除了這個容器外的基礎架構的容器,當原始方式去部署k8s時,用到的基礎架構的容器對應的鏡像是pause,可以理解為一直是暫停狀態。
pod中基礎架構的容器pause,為此pod中的主要容器主動提供網絡名稱空間,數據卷等功能。
一個pod中通常最好一個主容器。
pod中如果需要實現緊密容器的服務,可以有兩種方式,1,sidecar(邊車,輔助,側兜摩托)2,proxy代理istio
同一pod下的容器能共享掛載卷
1 查看pod標簽:kubectl get pod -n namespace --show-labels 2 Pod添加標簽:kubectl label pod ngx-dep app=myapp / kubectl label pod ngx-dep --overwrite {app=myapp,word=shit,mod=good} 3 Pod刪除標簽:kubectl label pod ngx-dep app- / kubectl label pod ngx-dep word- /kubectl label pod ngx-dep mod- 4 Pod篩選標簽:kubectl get pod -l key / kubectl get pod -l key=value / kubectl get -l key=value -L key / kubectl get pod -l key1,key2,keyn
service的模型:
userspace;iptables;ipvs
1.10-的版本是userspace/iptables
1.10+的版本是iptables/ipvs 一般不指定的話會自動降級到iptables,若想使用ipvs則在搭建環境時需要在/etc/sysconfig/kubelet文件中添加字段為:
KUBE_PROXY_MODE=ipvs
service的解析是緊密依賴於coredns的
service 服務方式:
clusterIP :供集群內布訪問使用
nodeport :供集群外部訪問使用 client->NodeIP:NodePort->clusterIP:servicePort->podIP:ContainerPort
externalIPs :用於使pod訪問集群外部資源
loadBalancerIP :用於雲平台環境中,集群外負載均衡調度
NoclusterIP:即clusterIP:后面參數為空,則為headless,無頭service,就是說這個服務的IP是它所有后端pod的IP:ServiceName->PodIP
clusterIP 例:
1 apiVersion: v1 2 kind: Service 3 metadata: 4 name: myapp-svc 5 namespace: default 6 spec: 7 selector: 8 app: myapp 9 release: canary 10 clusterIP: 10.99.99.99 11 type: ClusterIP 12 ports: 13 - port: 80 #service暴露的端口(iptables/ipvs規則) 14 targetPort: 80 #pod的端口
nodeport 例:
1 apiVersion: v1 2 kind: Service 3 metadata: 4 name: myapp-svc-headless 5 namespace: default 6 spec: 7 selector: 8 app: myapp 9 release: canary 10 clusterIP: 10.97.97.97 11 sessionAffinity: ClientIP #這個選項作用是,把來自於同一個客戶端的請求,始終發往同一個后端pod 12 type: NodePort 13 ports: 14 - port: 80 15 targetPort: 80 16 nodePort: 30080 #工作節點上對外暴露的端口
無頭headless service 例:一般用於對后端pod資源的調度。
1 apiVersion: v1 2 kind: Service 3 metadata: 4 name: myapp-svc-1 5 namespace: default 6 spec: 7 selector: 8 app: myapp 9 release: canary 10 clusterIP: None 11 ports: 12 - port: 80 13 targetPort: 80