{{ v.name }}
{{ v.cls }}類
{{ v.price }} ¥{{ v.price }}
k8s發布應用的兩種方式:
配置部署:包含應用名稱、容器鎰、pod數量、Service非常的方便,不想設置配置yaml的可以很方便的部署。
點擊部署就成功了k8s應用的部署了。部署后可以看到相應的deployment、pod、service等狀態和信息。
vim nginx-namespace.yaml
apiVersion: v1 #類型為Namespace kind: Namespace #類型為Namespace metadata: name: ns-test #命名空間名稱
labels: name: label-test #pod標簽
執行:
#創建
kubectl create -f nginx-namespace.yaml
#查詢
kubectl get namespace
一般不直接create pod,而是通過controller來創建pod。deployment為其中一種controller。
vim nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment metadata: namespace: ns-test
name: nginx-deployment
spec: selector: matchLabels: app: nginx
replicas: 3 template: metadata: labels: app: nginx
spec: containers: - name: nginx
image: nginx:alpine
ports: - containerPort: 80
執行:
#創建
kubectl create -f nginx-deployment.yaml
#查詢。查詢時需要等待一會,此時會下載鏡像需要時間
kubectl get deployment -n ns-test
#或
kubectl get pods -n ns-test
可以看到"replicas: 3",所以有3個pod并且每個pod只有一個容器。都正常啟動。
接下來看看如何訪問,查看訪問的端口:
kubectl get pods -o wide -n ns-test #-o wide 展開的意思
這時已經可以訪問了,就是通過虛擬ip來端口。
如下圖,只要集群范圍內的機器就可以直接通過IP訪問了。
那問題來了,這么多虛擬ip,每次pod重建還會重新生成,那怎么辦呢?
看下面的servcie。
vim nginx-service.yaml:
apiVersion: v1
kind: Service metadata: namespace: ns-test
name: nginx-service
spec: selector: app: nginx
ports: - protocol: TCP
port: 80 targetPort: 80
執行:
kubectl apply -f nginx-service.yaml
kubectl get svc nginx-service -o wide -n ns-test
可以看到有一個cluster-ip,通過這個端口+端口就可以負載到之前3個節點的nginx了。
當然cluster-ip也只能在集群內的機器訪問。再結合nginx或域名就可以向外提供負載均衡訪問了。
可以看到cluster-ip雖然有負載均衡的功能但還是不能外網訪問k8s部署的應用,那如何才能直接外網能訪問k8s部署的應用呢?
設置service為nodeport方式,如下:
apiVersion: v1
kind: Service metadata: namespace: ns-test
name: nginx-service
spec: selector: app: nginx
ports: - nodePort: 30000 protocol: TCP
port: 80 targetPort: 80 type: NodePort
其中type: NodePort另外想指定端口也可以加上nodePort: 30000。這樣就可以通過主機ip+nodePort的訪問k8s部署的應用了。
執行:
kubectl apply -f nginx-service.yaml
kubectl get svc nginx-service -o wide -n ns-test
可以看到我使用的是我主機的ip+nodePort可以直接訪問到nginx了。
Kubernetes 服務有四種類型:ClusterIP、NodePort、LoadBalancer 和ExternalName。服務spec中的type 屬性決定了服務如何暴露給網絡。