测试StatefulSet 是如何使用这个 DNS 记录来维持 Pod 的拓扑状态
创建svc.yaml
apiVersion: v1 kind: Service metadata: name: nginx labels: app: nginx spec: ports: - port: 80 name: web clusterIP: None selector: app: nginx
|
创建statefulset.yaml
apiVersion: apps/v1 kind: StatefulSet metadata: name: web spec: serviceName: "nginx" replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.9.1 ports: - containerPort: 80 name: web |
启动一个一次性的 Pod,因为–rm 意味着 Pod 退出后就会被删除掉。然后,在这个 Pod 的容器里面,我们尝试用 nslookup 命令,解析一下 Pod 对应的 Headless Service:
最好用1.28.4 用最新的latest会报错 。
kubectl run -i --tty --image busybox:1.28.4 dns-test --restart=Never --rm /bin/sh
nslookup web-0.nginx
输入kubectl get pod -w -l app=nginx查看nginx状态
另起一个Terminal 把这两个“有状态应用”的 Pod 删掉kubectl delete pod -l app=nginx
Watch界面看到结果如下 2个nginx 都又起来了 名称还是一样的
查看dns 是否变化
web-0.nginx 这条记录本身不会变,但它解析到的 Pod 的 IP 地址,并不是固定的。这就意味着,对于“有状态应用”实例的访问,你必须使用 DNS 记录或者 hostname 的方式,而绝不应该直接访问这些 Pod 的 IP 地址。
kubectl delete -f /opt/svc.yaml
kubectl delete -f /opt/statefulset.yaml