[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にアクセスしてください。

http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/

下記の画面が表示されます。

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://easy-study-forest.com/%E3%80%90%E3%81%B5%E3%82%8F%E3%81%A3%E3%81%A8%E3%82%8F%E3%81%8B%E3%82%8B%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E7%94%A8%E8%AA%9E%E3%80%91kubernetes-namespace%E3%81%A8%E3%81%AF%EF%BC%9F

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

https://github.com/envoyproxy/envoy

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

*