k8s發布應用的兩種方式:
- kube.NETes-dashboard
- kubectl命令行
一、Dashboard方式
配置部署:包含應用名稱、容器鎰、pod數量、Service非常的方便,不想設置配置yaml的可以很方便的部署。
點擊部署就成功了k8s應用的部署了。部署后可以看到相應的deployment、pod、service等狀態和信息。
- Deployment
- Pod
- Service
- 監控
二、命令行方式
1、創建namespace
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
2、創建pod
一般不直接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來端口。
- curl 10.244.1.43
- curl 10.244.1.44
- curl 10.244.1.45
如下圖,只要集群范圍內的機器就可以直接通過IP訪問了。
那問題來了,這么多虛擬ip,每次pod重建還會重新生成,那怎么辦呢?
看下面的servcie。
3、創建service
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了。
三、補充知識
1、Service
Kubernetes 服務有四種類型:ClusterIP、NodePort、LoadBalancer 和ExternalName。服務spec中的type 屬性決定了服務如何暴露給網絡。
- ClusterIP 類型的服務將在集群內部暴露,并分配一個 cluster IP 地址。Pod 可以通過這個 IP 地址來訪問該服務。ClusterIP 類型的服務適用于需要在集群內部訪問的服務,例如數據庫服務。
- NodePort 類型的服務將在每個節點上暴露一個端口,并分配一個 cluster IP 地址。外部客戶端可以通過 <NodeIP>:<NodePort> 來訪問該服務。NodePort 類型的服務適用于需要在集群外部訪問的服務,例如 Web 服務。
- LoadBalancer 類型的服務將使用集群外部的負載均衡器來暴露服務。外部客戶端可以通過負載均衡器的 IP 地址來訪問該服務。LoadBalancer 類型的服務適用于需要在集群外部訪問的服務,并且需要高可用性的服務。一般LoadBalancer是付費提供的。
- ExternalName 類型的服務將將服務指向一個外部主機或域名。Pod 可以通過該主機或域名來訪問該服務。ExternalName 類型的服務適用于需要訪問外部服務的場景。