# 1、Cluster IP
當創建K8s Service時,Cluster IP是默認的方式。這種Service分配了一個內部的IP,使其他組件可以訪問到pod。
使用一個獨立的IP地址,它可以使service負載均衡到多個pod。
service通過命令部署:
```
kubectl apply -f clusterip.yaml
```
這個定義文件可以查看:
```
cat clusterip.yaml
```
```
cat clusterip.yaml
apiVersion: v1
kind: Service
metadata:
name: webapp1-clusterip-svc
labels:
app: webapp1-clusterip
spec:
ports:
- port: 80
selector:
app: webapp1-clusterip
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: webapp1-clusterip-deployment
spec:
replicas: 2
template:
metadata:
labels:
app: webapp1-clusterip
spec:
containers:
- name: webapp1-clusterip-pod
image: katacoda/docker-http-server:latest
ports:
- containerPort: 80
---
```
這將會部署一個兩個副本的web app,使用service負載均衡。pod可以使用命令查看:
```
kubectl get pods
```
同時部署了一個service:
```
kubectl get svc
```
更多service配置和活動的端點(Pods)的詳細信息查看:
```
kubectl describe svc/webapp1-clusterip-svc
```
部署完,可以通過分配的ClusterIp進行訪問:
```
export CLUSTER_IP=$(kubectl get services/webapp1-clusterip-svc -o go-template='{{(index .spec.clusterIP)}}')
echo CLUSTER_IP=$CLUSTER_IP
curl $CLUSTER_IP:80
```
多個請求將會展示service如何在基于共同的標簽選擇器在多個pods之間負載均衡。
```
curl $CLUSTER_IP:80
```
# 2、Target Port
Target Port允許我們將服務可用的端口與應用程序偵聽的端口分離。TargetPort是應用程序配置要監聽的端口。Port是應用程序從外部訪問的端口。
查看clusterip-target.yaml
```
cat clusterip-target.yaml
apiVersion: v1
kind: Service
metadata:
name: webapp1-clusterip-targetport-svc
labels:
app: webapp1-clusterip-targetport
spec:
ports:
- port: 8080
targetPort: 80
selector:
app: webapp1-clusterip-targetport
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: webapp1-clusterip-targetport-deployment
spec:
replicas: 2
template:
metadata:
labels:
app: webapp1-clusterip-targetport
spec:
containers:
- name: webapp1-clusterip-targetport-pod
image: katacoda/docker-http-server:latest
ports:
- containerPort: 80
---
```
像先前一樣,service和另外的pod通過命令部署:
```
kubectl apply -f clusterip-target.yaml
```
查看service
```
kubectl get svc
```
```
kubectl describe svc/webapp-clusterip-targetport-svc
```
當service和pod都被部署了,可以像先前一樣通過cluster IP訪問,但是這次定義的port是8080。
```
export CLUSTER_IP=$(kubectl get services/webapp1-clusterip-targetport-svc -o go-template='{{(index .spec.clusterIP)}}')
echo CLUSTER_IP=$CLUSTER_IP
curl $CLUSTER_IP:8080
```
應用程序本身仍然配置的是監聽80端口。Kubernetes服務管理兩者之間的轉換。
# 3、NodePort
TargetPort和ClusterIP是在集群內是可用的,然而Nodeport通過定義一個靜態的端口在每個節點IP上暴露服務。不管集群內的哪個節點是可以訪問的,service在定義的端口上就是可以訪問的。
注:此時ClusterIP依然可用。
```
kubectl apply -f nodeport.yaml
```
當查看service定義時,注意添加的類型和NodePort屬性的定義。
```
cat nodeport.yaml
apiVersion: v1
kind: Service
metadata:
name: webapp1-nodeport-svc
labels:
app: webapp1-nodeport
spec:
type: NodePort
ports:
- port: 80
nodePort: 30080
selector:
app: webapp1-nodeport
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: webapp1-nodeport-deployment
spec:
replicas: 2
template:
metadata:
labels:
app: webapp1-nodeport
spec:
containers:
- name: webapp1-nodeport-pod
image: katacoda/docker-http-server:latest
ports:
- containerPort: 80
---
```
```
kubectl get svc
```
```
kubectl describe svc/webapp1-nodeport-svc
```
這個service現在可以通過定義的NodePort的節點IP地址訪問。
```
curl 172.17.0.34:30080
```
# 4、External IPs
另一種在集群外訪問service的方式時通過External IP地址。
更新定義文件的當前集群IP地址:
```
sed -i 's/HOSTIP/172.17.0.34/g' externalip.yaml
```
查看externalip.yaml
```
cat externalip.yaml
apiVersion: v1
kind: Service
metadata:
name: webapp1-externalip-svc
labels:
app: webapp1-externalip
spec:
ports:
- port: 80
externalIPs:
- 172.17.0.34
selector:
app: webapp1-externalip
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: webapp1-externalip-deployment
spec:
replicas: 2
template:
metadata:
labels:
app: webapp1-externalip
spec:
containers:
- name: webapp1-externalip-pod
image: katacoda/docker-http-server:latest
ports:
- containerPort: 80
---
```
```
kubectl apply -f externalip.yaml
```
```
kubectl get svc
```
```
kubectl describe svc/webapp1-externalip-svc
```
這個服務綁定到主節點的IP地址的80端口。
```
curl 172.17.0.34
```
# 5、Load Balancer
當在云上運行時,如EC2或Azure,可以配置和分配通過云提供商發布的公共IP地址。將會通過一個負載均衡器分發,如ELB(彈性負載均衡)。這允許將額外的公共IP地址分配給Kubernetes集群,而無需直接與云提供商交互。
雖然Katacoda不是云提供商,它仍然可以動態地為LoadBalancer類型的服務分配IP地址。部署云提供商使用:
```
kubectl appky -f cloudprovider.yaml
```
當在云提供商部署一個service,這是不必要的。
當一個service請求一個Load Balancer時,這個提供商將會從定義好的配置10.10.0.0/26范圍內分配一個。
```
kubectl get pods -n kube-system
```
```
kubectl apply -f loadbalancer.yaml
```
這個service通過一個Load Balancer定義,查看:
```
cat loadbalancer.yaml
apiVersion: v1
kind: Service
metadata:
name: webapp1-loadbalancer-svc
labels:
app: webapp1-loadbalancer
spec:
type: LoadBalancer
ports:
- port: 80
selector:
app: webapp1-loadbalancer
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: webapp1-loadbalancer-deployment
spec:
replicas: 2
template:
metadata:
labels:
app: webapp1-loadbalancer
spec:
containers:
- name: webapp1-loadbalancer-pod
image: katacoda/docker-http-server:latest
ports:
- containerPort: 80
---
```
當IP地址正在被分配,service將會Pending。當分配完,將會出現在service列表中。
```
kubectl get svc
```
```
kubectl describe svc/webapp1-loadbalancer-svc
```
這個service可以通過分配的IP地址訪問,這個例子中來自10.10.0.0范圍。
```
export LoadBalancerIP=$(kubectl get services/webapp1-loadbalancer-svc -o go-template='{{(index .status.loadBalancer.ingress 0).ip}}')
echo LoadBalancerIP=$LoadBalancerIP
curl $LoadBalancerIP
```
- 前言
- 安裝minikube
- 啟動一個單節點的Kubernetes集群
- 啟動一個多節點的集群使用kubeadm
- 使用kubectl部署容器
- 使用YAML部署容器
- 在K8s上部署Guestbook(留言簿)示例
- K8s網絡介紹
- 創建Ingress路由
- Liveness(存活探針)、Readiness(就緒探針)和健康檢查
- 使用CRI-O和kubeadm開始
- 在K8s上運行一個有狀態服務
- 管理K8s中的秘鑰和密碼
- 使用Kompose部署Docker Compose文件
- 在Kubernates上從源代碼部署一個服務
- 使用Heptio Velero備份和恢復
- Helm包管理器
- 基本的K8s的可觀察性(監控)
- 使用EFK記錄日志
- 在K8s上安裝Weave Scope