# NodePortを作成 $ kubectl expose deployment test-deployment --port=80 --type=NodePort $ kubectl get service test-deployment NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE test-deployment NodePort 10.107.114.198 <none> 80:31307/TCP 4m21s
上記Deploymentにアクセスするには、ノードのIPアドレスを調べる必要があります。minikubeではコマンドが用意されており、minikube ip で調べられます。 実態はminikubeノードとして起動しているDockerコンテナのアドレスです。
$ minikube ip 192.168.49.2
$ docker exec -it minikube ip -4 a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 2: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0 valid_lft forever preferred_lft forever 69: eth0@if70: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link-netnsid 0 inet 192.168.49.2/24 brd 192.168.49.255 scope global eth0 valid_lft forever preferred_lft forever
$ kubectl get service test-deployment NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE test-deployment LoadBalancer 10.108.139.68 <pending> 80:31284/TCP 70s
$ minikube tunnel
# EXTERNAL-IPが払い出されている $ kubectl get service test-deployment NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE test-deployment LoadBalancer 10.108.139.68 10.108.139.68 80:31284/TCP 2m35s
$ minikube start --nodes 2 $ kubectl get node NAME STATUS ROLES AGE VERSION minikube Ready control-plane,master 9m53s v1.22.1 minikube-m02 Ready <none> 9m35s v1.22.1
下のマニフェストでPod Anti Affinityを使ってみます。このDeploymentでは2つのPodが作成されますが、別々のノードに配置される設定になっています。
pod-antiaffinity.yaml
apiVersion:apps/v1 kind:Deployment metadata: name:hello spec: replicas:2 strategy: type:RollingUpdate rollingUpdate: maxUnavailable:100% selector: matchLabels: app:hello template: metadata: labels: app:hello spec: affinity: # ⬇⬇⬇ This ensures pods will land on separate hosts podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: -labelSelector: matchExpressions: [{ key:app, operator:In, values: [hello] }] topologyKey:"kubernetes.io/hostname" containers: -name:hello-from image:pbitty/hello-from:latest ports: -name:http containerPort:80 terminationGracePeriodSeconds:1
Podが異なるノードに配置されていることがわかります。
$ kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES hello-7db79cdc77-68mvs 1/1 Running 0 4m23s 10.244.0.3 minikube <none> <none> hello-7db79cdc77-gkpwm 1/1 Running 0 4m23s 10.244.1.5 minikube-m02 <none> <none>