建立 reids 的 pod 與 service
redis.yaml
apiVersion: apps/v1kind: Deploymentmetadata: labels: app: redis name: redis-masterspec: selector: matchLabels: app: redis replicas: 1 template: metadata: labels: app: redis spec: containers: - image: redis name: redis-master2 ports: - containerPort: 6379
redis-service.yaml
apiVersion: v1kind: Servicemetadata: name: redis-master-sr labels: name: redis-masterspec: ports: - port: 6379 targetPort: 6379 selector: app: redis
檢視 pod 與 service 資訊
將先之前 python 應用打包 docker build -t flaskk8s:dns .
建立 deployment.yaml
apiVersion: apps/v1kind: Deploymentmetadata: labels: app: flasktest name: flasktest namespace: yyxtestspec: selector: matchLabels: app: flasktest replicas: 2 template: metadata: labels: app: flasktest spec: containers: - image: flaskk8s:dns name: flaskweb imagePullPolicy: Never ports: - containerPort: 6000
再建立 service.yaml
apiVersion: v1kind: Servicemetadata: name: flask-service labels: name: flaskservice namespace: yyxtestspec: type: NodePort ports: - port: 6000 nodePort: 30003 selector: app: flasktest
這次在 deployment 和 service 中的 metadata 中都添加了namespace: yyxtest ,它們將會被建立到 yyxtest 的 namespace 中
使用kubectl get pods --namespace=yyxtest 來檢視 pods
#kubectl get pods --namespace=yyxtestNAME READY STATUS RESTARTS AGEflasktest-84f9699d44-bjzcn 1/1 Running 0 54mflasktest-84f9699d44-rtjzr 1/1 Running 0 54m#kubectl get services --namespace=yyxtestNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEflask-service NodePort 10.108.154.32 <none> 6000:30003/TCP 54m
這次我們訪問 http://127.0.0.1:30003 結果不出意料的報錯了
我們同樣在 default 的 namespace 中也建立 flask 的 pod 和 service,此時就可以正常的訪問。
我們使用 kubectl exec 命令分別進入到兩個 namespace 空間中的 flask 應用的 pod 中
在 default 的名稱空間中
# env...FLASK_SERVICE_SERVICE_HOST=10.109.55.91REDIS_MASTER_SR_SERVICE_PORT=6379...
它包含有這兩個環境變數,但是在 yyxtest 的 pod 中卻沒有這兩個環境變數,這也就說明,原來的程式碼在非 default 空間(準確的說是和 redis 不在同一個空間中)是不能正常執行的。
使用 dns 來解析服務地址除了可以使用環境變數來解析服務地址,用的更多的應該是使用 dns 來解析了,在建立 redis 的 service 時,Kubernetes 會建立一個相應的 DNS 條目,該條目的形式是 <service-name>.<namespace-name>.svc.cluster.local,這意味著如果容器只使用 <service-name>,它將被解析到本地名稱空間的服務。比如在 yaml 檔案中設定了
metadata: name: redis-master-sr
則會建立一個 redis-master-sr.default.svc.cluster.local的記錄, 我們在 default 名稱空間中的 pod 試一下
# ping redis-master-srPING redis-master-sr.default.svc.cluster.local (10.97.140.58) 56(84) bytes of data.
在 yyxtest 名稱空間中的 pod 再試一下
# ping redis-master-srping: redis-master-sr: Name or service not known
說明服務名只能在它所在的空間中(本例中的 default)有 dns 記錄,不在它的空間(本例中的 yyxtest)中則不存在,但是我們注意中,在 default 空間中 redis-master-sr 解析到了redis-master-sr.default.svc.cluster.local ,那麼在非 default 空間中是否可以正常解析redis-master-sr.default.svc.cluster.local 這個名稱呢?
在 yyxtest 的 pod 中執行
ping redis-master-sr.default.svc.cluster.localPING redis-master-sr.default.svc.cluster.local (10.97.140.58) 56(84) bytes of data.
也是可以正常解析的,所以這時我們來修改一下 python 的程式碼