Kubernetes核心概念之Service詳解
Service主要的功能是映射pod對應的端口到宿主機上(代理),或是做負載均衡,還可以將內部IP發布成外部IP
一.服務代理
1.首先創建RC的Pod(使用的是上一節的腳本)
vim rc.json
{ "apiVersion": "v1", "kind": "ReplicationController", "metadata": { //設置rc的元數據 "name": "nginx-rc" }, "spec": { //設置rc的具體規格 "replicas": 2, //設置Pod的具體數量 "selector": { //通過selector來匹配相應的Pod的label "name": "myservice" }, "template": { //設置Pod的模板 "metadata": { "labels": { "name":"myservice" } }, "spec": { "containers": [{ "name": "nginx", "image": "nginx", "imagePullPolicy": "IfNotPresent", //鏡像拉取策略,分為Always,Never,IfNotPresent,默認是Always "ports": [{ "containerPort": 80 }] }] } } } }
kubectl create -f rc.json
kubectl get pod
2.創建Service
①cat myservice.yaml
apiVersion: v1 kind: Service metadata: name: myservice #設定Service名稱,必須唯一 spec: selector: name: myservice #要匹配的Pod的Label ports: #設置端口轉發規則 - port: 80 targetPort: 80 protocol: TCP
②.kubectl create -f myservice.yaml
service "myservice" created
③.kubectl get service
現有兩個service,第一個是系統自動分配的service,下面一個可以看到咱們自己創建的service,訪問集群的IP是10.254.204.76,開放端口是80
④.kubectl describe service
Endpoints就是連接後端的Pod的容器的ip地址,因為通過Label成功連接上了Pod,現在訪問clusterip將被轉發到後端的Pod中
3.代理其他後端
①代理Mysql服務器
vim mysql-service.yaml
apiVersion: v1 kind: Service metadata: name: mysql spec: selector: name: mysql ports: - port: 3306 targetPort: 3306 protocol: TCP
②設置後端ip(縮進一定要正確,不然會報錯)
apiVersion: v1 kind: Endpoints metadata: name: mysql subsets: - addresses: - ip: 192.168.66.109 #節點ip ports: - port: 3306
③創建Service和Endpoints
kubectl create -f mysql-endpoints.yaml-f mysql-service.yaml
④查看Endpoints
kubectl describe ep
二.自動更新
1.將Pod數量縮減為一個
kubectl scale replicationcontroller --replicas=1 nginx-rc
replicationcontroller "nginx-rc" scaled
kubectl get rc
2.查看Service更新情況
kubectl describe service
三.發布Service
由於代理ip10.254.204.76不能通過外部訪問,但是web服務需要暴露到外網,這就需要一層轉發機制
1.NodePort Service
①創建NodePort Service
vim nodeport-service.yaml
apiVersion: v1 kind: Service metadata: name: my-nginx spec: selector: app: nginx ports: - name: http port: 80 targetPort: 80 protocol: TCP type: NodePort
kubectl create -f nodeport-service.yaml
②查詢NodePort Service
kubectl describe service my-nginx
K8S創建了一個NodePort,範圍是3000-32767,這裏就可以通過30664端口訪問到web服務,形式是NodeIP:NodePort,如果NodeIP是外網IP則將把流量分發給後端服務器
二.LoadBalancer與外部ip的指定
1.可以再K8S上指定一個不由K8S維護的外部IP,在外部訪問時直接使用這個IP就可以把請求分發到後端服務器
①創建Service
vim loadbalancer.yaml
apiVersion: v1 kind: Service metadata: name: my-nginx spec: selector: app: nginx externalIPs: ["121.100.110.88"] #指定一個外部IP ports: - name: http port: 80 targetPort: 80 protocol: TCP type: LoadBalancer #類型負載均衡
kubectl create -f loadbalancer.yaml
②查詢LoadBalancer Service
kubectl describe service my-nginx
此時外部訪問這個集群的方式為,http://121.100.110.88:31119
其實Service的內容遠遠不止這些,這些是一些比較常用的功能,如果在平時用到可以參考一下,下節講解存儲Volume
Kubernetes核心概念之Service詳解