-lでラベル指定できる
$ kubectl get po -l app=db% kubectl create deployment nginx --image nginx
deployment.apps/nginx created
% kubectl get deploy
NAME READY UP-TO-DATE AVAILABLE AGE
nginx 1/1 1 1 11s
% kubectl expose --type NodePort --port 80 deployment nginx
service/nginx exposed
% minikube service nginx% kubectl run pingtest -i --rm --image k8spracticalguide/busybox:1.28 --restart=Never -- ping -c 1 172.17.0.6
PING 172.17.0.6 (172.17.0.6): 56 data bytes
64 bytes from 172.17.0.6: seq=0 ttl=64 time=0.119 ms
--- 172.17.0.6 ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.119/0.119/0.119 ms
pod "pingtest" deleted% kubectl apply -f mattermost-deploy.yaml% kubectl create deploy mattermost --image k8spracticalguide/mattermost:4.10.2 -o yaml --dry-run=client > mattermost-deploy.yaml
% kubectl create deploy db --image k8spracticalguide/mysql:5.7.22 -o yaml --dry-run=client > db-deploy.yaml
% kubectl create cm common-env -o yaml --dry-run=client --from-literal MYSQL_USER=myuser --from-literal MYSQL_PASSWORD=mypassword --from-literal MYSQL_DATABASE=mattermost > cm.yaml
% kubectl create secret generic common-env -o yaml --dry-run=client --from-literal MYSQL_ROOT_PASSWORD=rootpassword --from-literal MYSQL_PASSWORD=mypassword > secret.yaml- clusterip はクラスタ内サービスの名前解決をする。spec.clusterIP を None にすると ClusterIP が付与されず pod の IP が直接返る(Headless Service)
% kubectl create svc clusterip mattermost-db --tcp 3306 -o yaml --dry-run=client > db-service.yaml- externalname はクラスタ内からクラスタ外のサービスの名前解決をする。ExternalName の CLUSTER-IP は付与されない
% kubectl create svc externalname ext-mattermost-db --external-name www.google.com
% kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ext-mattermost-db ExternalName <none> www.google.com <none> 98s
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 30d
mattermost-db ClusterIP 10.98.57.1 <none> 3306/TCP 25m- nodeport は CLUSTER-IP が使われているので、クラスタ内から名前解決できる
# expose だと mattermost という deployment が実際に存在しないとエラーになる
% kubectl expose --type NodePort --port 8065 deploy mattermost
% kubectl get svc mattermost -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
mattermost NodePort 10.102.79.83 <none> 8065:32427/TCP 74s app=mattermost
% kubectl run nslookup -i --rm --image busybox --restart=Never -- nslookup mattermost
Server: 10.96.0.10
Address: 10.96.0.10:53
Name: mattermost.default.svc.cluster.local
Address: 10.102.79.83
% minikube ip
192.168.49.2
# https://minikube.sigs.k8s.io/docs/handbook/host-access/
% minikube ssh
docker@minikube:~$ curl 192.168.49.2:32427 > /dev/null
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 3261 100 3261 0 0 3184k 0 --:--:-- --:--:-- --:--:-- 3184k
# create だと mattermost という deployment が実際に存在しなくても OK
% kubectl create service nodeport test --tcp 8080 --node-port 12345 --dry-run=client- ingress
% kubectl create ingress mattermost --rule=chat.foo.nip.io/=mattermost:8065 --dry-run=client -o=yaml
% minikube ssh
docker@minikube:~$ curl --resolve chat.foo.nip.io:80:127.0.0.1 chat.foo.nip.io > /dev/null
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 3261 100 3261 0 0 1592k 0 --:--:-- --:--:-- --:--:-- 1592k- loadbalancer
% kubectl expose deployment mattermost --port 8065 --type=LoadBalancer --name=lb
% kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 32d
lb LoadBalancer 10.106.202.206 <pending> 8065:31786/TCP 10s
mattermost NodePort 10.102.79.83 <none> 8065:32427/TCP 2d1h
mattermost-db ClusterIP 10.98.57.1 <none> 3306/TCP 2d2h
# 以下は別のターミナルで実行する
% minikube tunnel
🏃 Starting tunnel for service lb.
% kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 32d
lb LoadBalancer 10.106.202.206 127.0.0.1 8065:31786/TCP 2m14s
mattermost NodePort 10.102.79.83 <none> 8065:32427/TCP 2d1h
mattermost-db ClusterIP 10.98.57.1 <none> 3306/TCP 2d2h
% curl 127.0.0.1:8065 > /dev/null
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 3261 100 3261 0 0 297k 0 --:--:-- --:--:-- --:--:-- 1061k- loadbalancer の挙動
# 別のターミナルで minikube tunnel している
% kubectl get svc lb
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
lb LoadBalancer 10.106.202.206 127.0.0.1 8065:31786/TCP 17h
# クラスタ内から CLUSTER-IP へはアクセスできる
% kubectl run wgettest -i --rm --image k8spracticalguide/busybox:1.28 --restart=Never -- wget 10.106.202.206:8065
Connecting to 10.106.202.206:8065 (10.106.202.206:8065)
index.html 100% |*******************************| 3261 0:00:00 ETA
# loadbalancer は NodePort を使ってノードのポートを解放しているので minikube からアクセスできる
docker@minikube:~$ curl localhost:31786 > /dev/null
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 3261 100 3261 0 0 1592k 0 --:--:-- --:--:-- --:--:-- 3184k
# 自分のマシンからアクセスしてみる
# minikube の LoadBalancer(localhost:8065) > NodePort(192.168.49.2:31786) > ClusterIP(10.106.202.206:8065) > Pod(172.17.0.6:8065) の順で通る
% minikube ip
192.168.49.2
% kubectl get po -o=wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
db-799494d969-4vwwl 1/1 Running 0 2d20h 172.17.0.6 minikube <none> <none>
mattermost-6d77868f4c-hqr8n 1/1 Running 0 2d19h 172.17.0.7 minikube <none> <none>
% curl localhost:8065 > /dev/null
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 3261 100 3261 0 0 269k 0 --:--:-- --:--:-- --:--:-- 796k