首頁>技術>

建立 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 的程式碼

最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • Android程序排程:Low memory killer(1)