1. pod
Pod是一組緊密關聯(lián)的容器集合,它們共享PID、IPC、Network和UTS namespace,是Kubernetes調度的基本單位。Pod的設計理念是支持多個容器在一個Pod中共享網絡和文件系統(tǒng),可以通過進程間通信和文件共享這種簡單高效的方式組合完成服務.
1.1 創(chuàng)建pod
# vim http.yaml
apiVersion: v1
kind: Pod
metadata:
? name: demo
spec:
? containers:
? - image: httpd
? ? name: httpd
? ? imagePullPolicy: Always
# kubectl create -f pod.yaml
1.2 查看pod
# kubectl get pods
#?kubectl describe pods
1.3 刪除pod
#?kubectl delete pod <pod-name>
2.?Replicaset
Replicaset在繼承Pod的所有特性的同時, 它可以利用預先創(chuàng)建好的模板定義副本數(shù)量并自動控制, 通過改變Pod副本數(shù)量實現(xiàn)Pod的擴容和縮容.
2.1?創(chuàng)建Replicaset
# vi replicaset.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
? name: demo-rc
? labels:
? ? app: demo-rc
spec:
? replicas: 2
? selector:
? ? matchLabels:
? ? ? app: demo-rc
? template:
? ? metadata:
? ? ? labels:
? ? ? ? app: demo-rc
? ? spec:
? ? ? containers:
? ? ? - name: httpd
? ? ? ? image: httpd
? ? ? ? imagePullPolicy: Always
...
3.?Deployment
Deployment在繼承Pod和Replicaset的所有特性的同時, 它可以實現(xiàn)對template模板進行實時滾動更新并具備我們線上的Application lifecycle的特性.
3.1 create
apiVersion: apps/v1
kind: Deployment
metadata:
? name: httpd-deployment
? labels:
? ? app: httpd-deployment
spec:
? replicas: 2
? selector:
? ? matchLabels:
? ? ? app: httpd-demo
? template:
? ? metadata:
? ? ? labels:
? ? ? ? app: httpd-demo
? ? spec:
? ? ? containers:
? ? ? - name: httpd
? ? ? ? image: httpd
? ? ? ? imagePullPolicy: Always
? ? ? ? ports:
? ? ? ? - containerPort: 80
? ? ? ? env:
? ? ? ? - name: VERSION
? ? ? ? ? value: "v1"
...
3.5?更新deployment
# kubectl edit -f deployment.yaml
通過此命令使當前編輯結果生效.
# kubectl apply -f deployment.yaml
3.6?擴容與縮容
可以修改replicas的賦值對deployment進行擴容與縮容
#??kubectl scale deployment/httpd-deployment --replicas=1
4.?Label
Label是attach到Pod的一對鍵/值對,用來傳遞用戶定義的屬性。比如,你可能創(chuàng)建了一個"tier"和“app”標簽,通過Label(tier=frontend, app=myapp)來標記前端Pod容器,使用Label(tier=backend, app=myapp)標記后臺Pod。然后可以使用Selectors選擇帶有特定Label的Pod,讓具體某一個Pod或者Deployment去使用某一個Service實現(xiàn)特定的網絡配置.
5.?Service
Service是應用服務的抽象,通過labels為應用提供負載均衡和服務發(fā)現(xiàn)。匹配labels的Pod IP和端口列表組成endpoints,由kube-proxy負責將服務IP負載均衡到這些endpoints上。
每個Service都會自動分配一個cluster IP(僅在集群內部可訪問的虛擬地址)和DNS名,其他容器可以通過該地址或DNS來訪問服務,而不需要了解后端容器的運行。
5.1?更改NodePort限制
Kubernetes默認對外的NodePort限制范圍為30000-32767, 這里如果要使用一些常用的端口(80, 8080, 443)需將這個范圍放大.
#?vi /etc/kubernetes/manifests/kube-apiserver.yaml
在--service-cluster-ip-range與insecure-port間添加如下node port配置
- --service-cluster-ip-range=10.96.0.0/12
- --service-node-port-range=0-32767
- --insecure-port=0
重啟服務
# systemctl restart kubelet
5.2 創(chuàng)建service
# vi svc.yaml
apiVersion: v1
kind: Service
metadata:
? name: demo
spec:
? type: NodePort
? ports:
? ? - port: 80
? ? ? nodePort: 30050
? selector:
? ? app: httpd-demo
# kubectl create -f svc.yaml
其中,port是pod提供的端口號,所有符合selector要求的pod提供的端口號都是80.
而nodeport是service對外提供服務所暴露的端口號。
5.3 查看service?
# kubectl get svc demo
NAME? ? TYPE? ? ? ? CLUSTER-IP? ? ? ? ? ? EXTERNAL-IP? PORT(S)? ? ? ? ? AGE
demo? ? ? NodePort? 10.100.57.243? ? ? ? ? <none>? ? ? ? ? ? ?80:30050/TCP? 28m
# kubectl describe svc demo
Name: demo
Namespace:? ? ? ? ? ? ? ? default
Labels:? ? ? ? ? ? ? ? ?
Annotations:? ? ? ? ? ? ?
Selector:? ? ? ? ? ? ? ? app=httpd-demo
Type:? ? ? ? ? ? ? ? ? ? NodePort
IP:? ? ? ? ? ? ? ? ? ? ? 10.100.57.243
Port:? ? ? ? ? ? ? ? ? ? ? 80/TCP
TargetPort:? ? ? ? ? ? ? 80/TCP
NodePort:? ? ? ? ? ? ? ? ? 30050/TCP
Endpoints:? ? ? ? ? ? ? ? 10.244.0.3:80,10.244.1.5:80
Session Affinity:? ? ? ? None
External Traffic Policy:? Cluster
Events:? ? ? ? ? ? ? ? ?<none>
# kubectl get pod -o wide
NAME? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? READY? ? STATUS? ? RESTARTS? AGE? ? ? IP? ? ? ? ? NODE
demo? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1/1? ? ? Running? 0? ? ? ? ? 53m? ? ? 10.244.1.4? minion
httpd-deployment-5b749686c9-cfbkc? 1/1? ? ? Running? 0? ? ? ? ? 8m? ? ? ? 10.244.1.5? minion
httpd-deployment-5b749686c9-qjw7r? 1/1? ? ? Running? 0? ? ? ? ? 8m? ? ? ? 10.244.0.3? master
source-ip-app-8687dbf9f-kzb6h? ? ? 1/1? ? ? Running? 0? ? ? ? ? 58m? ? ? 10.244.1.3?
可以看到,service中的selector信息為app: httpd-demo。create service的時候,會根據selector信息去匹配符合的pod,所有符合匹配的pod都會提供80端口,通過service demo向外提供服務,統(tǒng)一以ip?10.100.57.243暴露30050端口。
可以通過# curl?10.100.57.243 訪問到service。