在k8s中的基本概念php
一.Pod
1. pod
k8s下最重要也最基本的概念,由一個根容器Pause和許多用戶業務容器組成,是容器的載體.html
2. pod的yaml定義格式及字段node
apiVersion: v1 //版本 kind: pod //類型,pod metadata: //元數據 name: String //元數據,pod的名字 namespace: String //元數據,pod的命名空間 labels: //元數據,標籤列表 - name: String //元數據,標籤的名字 annotations: //元數據,自定義註解列表 - name: String //元數據,自定義註解名字 spec: //pod中容器的詳細定義 containers: //pod中的容器列表,能夠有多個容器 - name: String image: String //容器中的鏡像 imagesPullPolicy: [Always|Never|IfNotPresent]//獲取鏡像的策略 command: [String] //容器的啓動命令列表(不配置的話使用鏡像內部的命令) args: [String] //啓動參數列表 workingDir: String //容器的工做目錄 volumeMounts: //掛載到到容器內部的存儲卷設置 - name: String mountPath: String readOnly: boolean ports: //容器須要暴露的端口號列表 - name: String containerPort: int //容器要暴露的端口 hostPort: int //容器所在主機監聽的端口(容器暴露端口映射到宿主機的端口) protocol: String env: //容器運行前要設置的環境列表 - name: String value: String resources: //資源限制 limits: cpu: Srting memory: String requeste: cpu: String memory: String livenessProbe: //pod內容器健康檢查的設置 exec: command: [String] httpGet: //經過httpget檢查健康 path: String port: number host: String scheme: Srtring httpHeaders: - name: Stirng value: String tcpSocket: //經過tcpSocket檢查健康 port: number initialDelaySeconds: 0//首次檢查時間 timeoutSeconds: 0 //檢查超時時間 periodSeconds: 0 //檢查間隔時間 successThreshold: 0 failureThreshold: 0 securityContext: //安全配置 privileged: falae restartPolicy: [Always|Never|OnFailure]//重啓策略 nodeSelector: object //節點選擇 imagePullSecrets: - name: String hostNetwork: false //是否使用主機網絡模式,默認否 volumes: //在該pod上定義共享存儲卷 - name: String meptyDir: {} hostPath: path: string secret: //類型爲secret的存儲卷 secretName: String item: - key: String path: String configMap: //類型爲configMap的存儲卷 name: String items: - key: String path: String
3. label 和 label selector
label是k8s中的核心概念,label由key和value組成,用戶自定義,用以區分和篩選pod.
如:Service和ReplicationController中篩選component爲redis的pod
selector:
component: redisnginx
二.ReplicationController
1.ReplicationController(簡稱Rc)
Rc控制了定期望的數量來運行pod.Rc定義包括瞭如下部分:
a.期待的pod副本數
b.篩選目標pod的label selector
c.但pod小於指定副本數的時候,用於建立pod的模板(template).web
2.定義示例:redis
apiVersion: v1 kind: ReplicationController metadata: name: nginx spec: replicas: 3 selector: app: nginx template: metadata: name: nginx labels: app: nginx spec: containers: - name: nginx image: nginx ports: - containerPort: 80
3.刪除Rc並不會刪除rc建立的pod.爲了刪除全部pod,能夠將replicas設置爲0.
如:
kubectl scale rc php-rc --replicas 0docker
4.擴容
kubectl scale rc php-rc --replicas 2後端
5.自動控制pod副本數量最小1,最大4:
kubectl autoscale rc php-rc --min=1 --max=4 api
三.Deployment
在內部使用了Replica Set(能夠看作是Rc的升級版本,90%與Rc類似).安全
三.Service
1.概念及做用:
定義了一個服務訪問的入口地址,由於pod副本會有多個,一樣的地址也就有多個,若是沒有service,將須要考慮pod的負載均衡問題.換句話說service將一組pod組成一個集合來提供給其餘資源,用戶無需關注各個pod副本.
Service與先後端的Pod集羣經過label selector來實現對接,rc保證了service(其實是pod的數量)服務質量
2.IP種類
Node IP: 節點IP(物理網卡)
Pod IP: pod上的IP(Docker Engine分配)
Cluster IP: service上的IP(K8s分配,沒法被ping)
3.ports屬性:
nodePort: 外部訪問service,經過nodeIP:nodePort方式提供給外部訪問k8s中的服務(須要配置對應service的type爲NodePort,同時在節點服務器上設置轉發iptables -P FORWARD ACCEPT,默認爲30000-32767)
port: k8s內部訪問service的端口
targetPort: 容器的端口,是pod上的端口(如無指定,默認和port相同)
流量進入路徑爲:nodePort -> port -> targetPort
4.服務發現:
環境變量(可進入具體的pod中查看每一個service對應的環境變量)和kube-dns
5.Service的type類型:
ClusterIP: 僅僅使用一個集羣內部的IP地址 - 這是默認值。選擇這個值意味着你只想這個服務在集羣內部才能夠被訪問到
請注意,這個內部訪問指的是在集羣內部的pod上能夠訪問service,
並非集羣內部節點上直接訪問;在service所在pod的節點主機上是能夠直接以ClusterIP:端口的形式訪問到;若是pod不在該節點上,節點主機要訪問該service,須要作IP轉發:
ip route add 10.254.0.0/16 dev docker0
10.254.0.0是service網段
你能夠在節點服務器上運行:
iptables -S -t nat | grep KUBE-SERVICES
來查看轉發規則
NodePort: 在集羣內部IP的基礎上,在集羣的每個節點的端口上開放這個服務。你能夠在外部經過<NodeIP>:NodePort地址上訪問到這個服務(其中NodeIP是任意節點的ip地址)
LoadBalancer: 在使用一個集羣內部IP地址和在NodePort上開放一個服務以外,向雲提供商申請一個負載均衡器,會讓流量轉發到這個在每一個節點上以<NodeIP>:NodePort的形式開放的服務上。
四.存儲卷(Volume)
1.示例:
spec: containers: - name: nginx image: nginx:alpine volumeMounts: - name: web-root mountPath: /usr/share/nginx/html volumes: - name: web-root nfs: server: 192.168.2.17 path: /data/nfs
2.volume取值
emptyDir: 是在pod分配到node上建立的,初始內容爲空;無需指定名稱,k8s會自動分配目錄.pod移除時,該目錄也被刪除.
hostPath: 在pod上掛載宿主機上的目錄.
nfs: 使用nfs網絡文件系統提供的共享目錄
五.命名空間
1.k8s默認使用的命名空間是default,使用kubectl get namespaces查看
2.定義命名空間:
apiVersion: v1 kind: namespace metadata: name: projectA
3.使用命名空間:
apiVersion: v1 kind: Pod metadata: name: nginx-pod namespace: projectA labels: name: nginx-pod spec: containers: - name: nginx ....
4.namespace能夠實現多用戶資源隔離
查看全部命名空間下的pods
#kubectl get pods --all-namespaces
六.kubectl命令行工具用法
1.語法:
kubectl [command] [TYPE] [NAME] [flags]
(1)command:子命令,用於操做k8s集羣資源對象的命令.如create, delete, describe, get, apply
(2)TYPE:資源對象的類型,區分大小寫,能以單數形式,複數形式或者簡寫形式表示.如pod,service,node等
(3)NAME:資源對象的名稱,區分大小寫,若是不指定,則返回所有.
(4)flags:子命令可選參數,如-s指定apiserver的url地址而不使用默認值
2.輸出格式:
輸出格式經過-o參數指定
3.操做示例
(1).建立資源對象
根據yaml配置文件建立
kubectl create -f my-service.yaml my-pod.yaml
(2)查看資源對象
kubectl get pod,rc,service
(3)描述資源對象
kubectl describe pods
顯示由rc管理的pod信息
kubectl describe pods <rc-name>
(4)刪除資源對象
kubectl delete -f my-service.yaml
經過label刪除
kubectl delete pods -l name=<label-name>
刪除全部
kubectl delte pods --all
(5)執行容器命令
默認使用pod中的第一個容器:
kubectl exec <pod-name> date
指定pod中的容器執行命令:
kubectl exec <pod-name> -c <conatiner-name> date
經過bash得到pod中某個容器的tty,至關於登陸容器:
kubectl exec -ti <pod-name> -c <conatiner-name> /bin/bash
6.查看容器日誌:查看容器輸出到stdout的日誌kubectl logs <pod-name>跟蹤查看容器的日誌,至關於tail -f:kubectl logs -f <pod-name> -c <conatiner-name>