[A-00103]Kubernetesを使ってみる
kubernetesの使い方について記載しておく。
・インストールする
インストール方法は公式ドキュメントかbrewで実行可能
brew install kubectl
インストールが完了したら下記のコマンドでバージョンを確認
kubectl version
MacBook-Pro:kube$ kubectl version
Client Version: version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.3", GitCommit:"ca643a4d1f7bfe34773c74f79527be4afd95bf39", GitTreeState:"clean", BuildDate:"2021-07-15T21:04:39Z", GoVersion:"go1.16.6", Compiler:"gc", Platform:"darwin/amd64"}
Server Version: version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.3", GitCommit:"ca643a4d1f7bfe34773c74f79527be4afd95bf39", GitTreeState:"clean", BuildDate:"2021-07-15T20:59:07Z", GoVersion:"go1.16.6", Compiler:"gc", Platform:"linux/amd64"}
・Kubernetesダッシュボードにアクセスする
UI形式でkubernetesを確認する事ができます。
下記をコマンドを実行してください。
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0/aio/deploy/recommended.yaml
kubectl proxy
これでアクセスできるようになったので下記のURLにアクセスしてください。
下記の画面が表示されます。

Tokenを取得するため、ターミナルを起動して下記のコマンドを実行します。
kubectl -n kube-system get secret | grep deploy
MacBook-Pro:kube$ kubectl -n kube-system get secret | grep deploy
deployment-controller-token-pcwn8 kubernetes.io/service-account-token 3 44m
上記の[deployment-controller-token-pcwn8](ユーザーによって異なります。ローカルで実行・取得したものを使用してください)をコピーして次のコマンドで使用する。
kubectl -n kube-system describe secret <ここに値を貼り付け>
MacBook-Pro:kube$ kubectl -n kube-system describe secret deployment-controller-token-pcwn8
Name: deployment-controller-token-pcwn8
Namespace: kube-system
Labels: <none>
Annotations: kubernetes.io/service-account.name: deployment-controller
kubernetes.io/service-account.uid: xxxxxxxxx
Type: kubernetes.io/service-account-token
Data
====
token: eyJhbGciOiJSUzI1NiIsImtpZCI6InpkZjl4SXVhZTFQdmYwZUpyWEdZaUhJeXdNdFU2cjY0bC05cUxJaDlobU0ifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkZXBsb3ltZW50LWNvbnRyb2xsZXI........
ca.crt: 1066 bytes
namespace: 11 bytes
一番したにあるtoken:の下の値をコピーして先ほどの画面に貼り付けします。

上記で[Sign in]ボタンを押下すれば下記の画面に遷移できます。

・Podを作成してみる
kubernetesリソースの最小単位であるPodを作成します。
Podは複数のコンテナを持つことができます。今回は1つのコンテナで構成されるPodを作成しようと思います。
適当なyamlファイルを作成します。そこにPodの定義を記述します。
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
spec:
containers:
- name: nginx-container
image: nginx:latest
ports:
- containerPort: 8090
下記のコマンドを実行して作成します。
kubectl apply -f <yaml-file-name>
MacBook-Pro:kubernetes$ kubectl apply -f pod-nginx.yml
pod/nginx-pod created
Podのプロセスは下記のコマンドで確認できます。
kubectl get pod
MacBook-Pro:kubernetes$ kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-pod 1/1 Running 0 94s
・Podを削除する
作成したPodの削除は下記のコマンドを実行します。
kubectl delete pod <pod-name>
MacBook-Pro:kubernetes$ kubectl delete pod nginx-pod
pod "nginx-pod" deleted
・Serviceを作成してみる
yamlファイルからkubernetesのサービスを作成してみます。
適当なディレクトリにplay-app-service.ymlを作成してください。
apiVersion: v1
kind: Service
metadata:
name: play-app-svc
spec:
selector:
app: play-app-svc
ports:
- protocol: TCP
port: 9000
targetPort: 9000
下記のコマンドを実行してサービスを作成・起動します。
kubectl apply -f <yaml-file-name>
MacBook-Pro:kubernetes$ kubectl apply -f play-app-service.yml
service/play-app-svc created
次に作成したサービスのプロセスを確認したいと思います。
kubectl get service <service-name>
MacBook-Pro:kubernetes$ kubectl get service play-app-svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
play-app-svc ClusterIP 10.110.162.204 <none> 9000/TCP 2m8s
・Serviceを削除する
作成したServiceは下記のコマンドで削除します。
kubectl delete service <service-name>
MacBook-Pro:kubernetes$ kubectl delete service play-app-svc
service "play-app-svc" deleted
MacBook-Pro:kubernetes$ kubectl get service play-app-svc
Error from server (NotFound): services "play-app-svc" not found
・Hello,worldサービスを作ってみる
namespace,deployment,serviceを作成してHello,worldサービスを作成してみます。

namespaceは下記のymlで作成します。
apiVersion: v1
kind: Namespace
metadata:
name: k8s-tutorial
user@usernoMBP web-service % kubectl apply -f service-name.yml
namespace/web-app1 created
user@usernoMBP web-service % kubectl get namespace
NAME STATUS AGE
default Active 7d8h
kube-node-lease Active 7d8h
kube-public Active 7d8h
kube-system Active 7d8h
web-app1 Active 37s
deploymentを作成します。
apiVersion: apps/v1
kind: Deployment
metadata:
name: kubernetes-bootcamp
namespace: k8s-tutorial
spec:
selector:
matchLabels:
app: kubernetes-bootcamp
template:
metadata:
labels:
app: kubernetes-bootcamp
spec:
containers:
- name: kubernetes-bootcamp
image: gcr.io/google-samples/kubernetes-bootcamp:v1
resources:
limits:
memory: "128Mi"
cpu: "500m"
user@usernoMBP web-service % kubectl apply -f deployment.yml
deployment.apps/kubernetes-bootcamp created
serviceを作成します。
apiVersion: v1
kind: Service
metadata:
name: kubernetes-bootcamp
namespace: k8s-tutorial
spec:
selector:
app: kubernetes-bootcamp
type: NodePort
ports:
- port: 80
targetPort: 8080
user@usernoMBP web-service % kubectl apply -f service.yml
service/kubernetes-bootcamp created
NodePortで作成しているため、localhostでアクセスできます。ポート番号を確認するため、get serviceを実行します。
user@usernoMBP web-service % kubectl get services -n k8s-tutorial
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes-bootcamp NodePort 10.100.193.223 <none> 80:31609/TCP 12m
上記からポートは31609だとわかります。curlでアクセスします。
user@usernoMBP web-service % curl localhost:31456
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-6f788bd769-x4mz9 | v=1
動作確認ができたので下記のコマンドで削除します。
user@usernoMBP web-service % kubectl delete -f service.yml
service "kubernetes-bootcamp" deleted
user@usernoMBP web-service % kubectl delete -f deployment.yml
deployment.apps "kubernetes-bootcamp" deleted
user@usernoMBP web-service % kubectl delete -f namespace.yml
namespace "k8s-tutorial" deleted
・MogoDB+WebAPP構成のシステムを作成してみる
k8sのdemoからMongoDB+WebAPP構成のシステムを作成します。

namesapceを作成する
apiVersion: v1
kind: Namespace
metadata:
name: mongo-web-app-ns
user@usernoMBP mongo-web-app % kubectl apply -f namespace.yml
namespace/mongo-web-app-ns created
configMapを作成する
apiVersion: v1
kind: ConfigMap
metadata:
name: mongo-config
namespace: mongo-web-app-ns
data:
mongo-url: mongo-service
user@usernoMBP mongo-web-app % kubectl apply -f config.yml
configmap/mongo-config created
secretを作成する
apiVersion: v1
kind: Secret
metadata:
name: mongo-secret
namespace: mongo-web-app-ns
type: Opaque
data:
mongo-user: bW9uZ291c2Vy
mongo-password: bW9uZ29wYXNzd29yZA==
user@usernoMBP mongo-web-app % kubectl apply -f secret.yml
secret/mongo-secret created
MongoDBのdeploymentを作成する
apiVersion: apps/v1
kind: Deployment
metadata:
name: mongo-deployment
namespace: mongo-web-app-ns
labels:
app: mongo
spec:
replicas: 1
selector:
matchLabels:
app: mongo
template:
metadata:
labels:
app: mongo
spec:
containers:
- name: mongodb
image: mongo:5.0
ports:
- containerPort: 27017
env:
- name: MONGO_INITDB_ROOT_USERNAME
valueFrom:
secretKeyRef:
name: mongo-secret
key: mongo-user
- name: MONGO_INITDB_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mongo-secret
key: mongo-password
user@usernoMBP mongo-web-app % kubectl apply -f mongo.yml
deployment.apps/mongo-deployment created
MongoDBのserviceを作成する
apiVersion: v1
kind: Service
metadata:
name: mongo-service
namespace: mongo-web-app-ns
spec:
selector:
app: mongo
ports:
- protocol: TCP
port: 27017
targetPort: 27017
user@usernoMBP mongo-web-app % kubectl apply -f service-mongo.yml
service/mongo-service created
webappのdeploymentを作成する
apiVersion: apps/v1
kind: Deployment
metadata:
name: webapp-deployment
namespace: mongo-web-app-ns
labels:
app: webapp
spec:
selector:
matchLabels:
app: webapp
replicas: 1
template:
metadata:
labels:
app: webapp
spec:
containers:
- name: webapp
image: nanajanashia/k8s-demo-app:v1.0
ports:
- containerPort: 3000
env:
- name: USER_NAME
valueFrom:
secretKeyRef:
name: mongo-secret
key: mongo-user
- name: USER_PWD
valueFrom:
secretKeyRef:
name: mongo-secret
key: mongo-password
- name: DB_URL
valueFrom:
configMapKeyRef:
name: mongo-config
key: mongo-url
user@usernoMBP mongo-web-app % kubectl apply -f webapp.yml
deployment.apps/webapp-deployment created
webappのserviceを作成する
apiVersion: v1
kind: Service
metadata:
name: webapp-service
namespace: mongo-web-app-ns
spec:
type: NodePort
selector:
app: webapp
ports:
- protocol: TCP
port: 3000
targetPort: 3000
nodePort: 30100
user@usernoMBP mongo-web-app % kubectl apply -f service-webapp.yml
service/webapp-service created
上記が作成できたらportは30100で指定しているのでwebブラウザでlocalhost:30100を開く

上記が確認できたらリソースを削除する
user@usernoMBP mongo-web-app % kubectl delete -f service-webapp.yml
service "webapp-service" deleted
user@usernoMBP mongo-web-app % kubectl delete -f webapp.yml
deployment.apps "webapp-deployment" deleted
user@usernoMBP mongo-web-app % kubectl delete -f service-mongo.yml
service "mongo-service" deleted
user@usernoMBP mongo-web-app % kubectl delete -f mongo.yml
deployment.apps "mongo-deployment" deleted
user@usernoMBP mongo-web-app % kubectl delete -f secret.yml
secret "mongo-secret" deleted
user@usernoMBP mongo-web-app % kubectl delete -f config.yml
configmap "mongo-config" deleted
user@usernoMBP mongo-web-app % kubectl delete -f namespace.yml
namespace "mongo-web-app-ns" deleted
・1podで複数コンテナを動かす
1podの中で複数コンテナを動かすには下記のpod設定にて2つcontainerを定義することで実現できます。
apiVersion: v1
kind: Pod
metadata:
name: mc1
namespace: k8s-test
spec:
volumes:
- name: html
emptyDir: {}
containers:
- name: 1st
image: nginx
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
- name: 2nd
image: debian
volumeMounts:
- name: html
mountPath: /html
command: ["/bin/sh", "-c"]
args:
- while true; do date >> /html/index.html; sleep 1; done
apiVersion: v1
kind: Namespace
metadata:
name: k8s-test
・Envoyを使ってみる
sidecarコンテナとしてk8sとセットで使用されるenvoyプロキシについて学習する。
envoyの用途としては下記の通り
- Edge Proxy
- Service Discovery
- Communication-bath of Service Mesh(microservice)
- LoadBalancer
- Circuit Breaker


上記の用途で広く用いられているEnvoyですが共通して言えることは通信を担う部分で主に使用されるということです。マイクロサービスのようにメッシュ構造のあるシステムではどこに通信するべきかService RegistryとService Discoveryの役目を誰かが担う必要がありますが、そのロールとして用いられるのがEnvoyというわけです。
・EnvoyでFront Proxy作ってみる
envoy公式にあるdemoを実践してみます。
イメージ図は下記の通りです。

static_resources:
listeners:
- name: listener_0
address:
socket_address:
address: 0.0.0.0
port_value: 10000
filter_chains:
- filters:
- name: envoy.filters.network.http_connection_manager
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
stat_prefix: ingress_http
access_log:
- name: envoy.access_loggers.stdout
typed_config:
"@type": type.googleapis.com/envoy.extensions.access_loggers.stream.v3.StdoutAccessLog
http_filters:
- name: envoy.filters.http.router
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
route_config:
name: local_route
virtual_hosts:
- name: local_service
domains: ["*"]
routes:
- match:
prefix: "/"
route:
host_rewrite_literal: www.envoyproxy.io
cluster: service_envoyproxy_io
clusters:
- name: service_envoyproxy_io
type: LOGICAL_DNS
# Comment out the following line to test on v6 networks
dns_lookup_family: V4_ONLY
load_assignment:
cluster_name: service_envoyproxy_io
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: www.envoyproxy.io
port_value: 443
transport_socket:
name: envoy.transport_sockets.tls
typed_config:
"@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext
sni: www.envoyproxy.io
上記を実行します。
envoy -c envoy1.yml
localhost:10000にアクセスするとgoogleの検索画面が表示されます。

・Dockerでenvoyを動かしてみる
envoyをcontainerで動かしてみます。
・Appendix
公式ドキュメントは下記
https://kubernetes.io/ja/docs/tasks/tools/install-kubectl/
参考文献はこちら
https://snowsystem.net/container/kubernetes/kubernetes-dashboard-token/
https://qiita.com/kouares/items/94a073baed9dffe86ea0
https://qiita.com/suzukihi724/items/241f7241d297a2d4a55c
https://amateur-engineer-blog.com/kubernetes-service/
https://qiita.com/tom_negocia/items/d1302cc3ad4657ad3466
https://qiita.com/LittleBear-6w6/items/2a6497fecbb75ed12394
https://qiita.com/dingtianhongjie/items/8f3c320c4eb5cf25d9de
https://qiita.com/boocsan/items/6e98e0b8960741ad8dbf
https://gitlab.com/nanuchi/k8s-in-1-hour/-/tree/master?ref_type=heads
https://qiita.com/mamorita/items/f714f37e354cb7ff73cd
https://github.com/walk8243/kubernetes-communication
https://qiita.com/walk8243/items/604aac748daeee9d8c05
https://linchpiner.github.io/k8s-multi-container-pods.html
https://github.com/allingeek/ch6_ipc
https://codilime.com/blog/envoy-configuration
https://qiita.com/kentakozuka/items/3fd5ced3213c76824620
https://docs.solo.io/gloo-edge/latest/guides/observability/tracing/envoy
https://i-beam.org/2019/02/03/envoy-static-load-balancer
https://github.com/int128/hello-envoy/tree/main
https://edocs.humansecurity.com/docs/complete-example
https://www.envoyproxy.io/docs/envoy/latest/configuration/other_features/internal_listener
https://github.com/jun06t/envoy-sample
コメントを残す