kubectlコマンドの使い方(1.4)

#1 環境
VMware Warksattion12上の仮想マシン(マスタ1台,ノード1台)を使用しました。
各仮想マシンのOS版数、kubectl版数は以下のとおりです。

```
[root@master ~]# cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)

[root@master ~]# uname -r
3.10.0-514.el7.x86_64

[root@master ~]# kubectl --version
Kubernetes v1.4.0

```


#2 kubectl config
ここでは、コマンドの使い方だけを示します。どのように使うのかは、また別途書く予定。

##2.1 サブコマンド一覧
kubectl configコマンドのサブコマンド一覧を以下に示します。

```
[root@master ~]# kubectl config
current-context  delete-context   get-contexts     set-cluster      set-credentials  use-context
delete-cluster   get-clusters     set              set-context      unset            view

```


##2.2 コンテキストを作成、表示する方法

```
ユーザ(user1)を作成する。
[root@master ~]# kubectl config set-credentials user1 --username=user1 --password=pass1
user "user1" set.

ユーザ(user2)を作成する。
[root@master ~]# kubectl config set-credentials user2 --username=user2 --password=pass2
user "user2" set.

クラスタを作成する。
[root@master ~]# kubectl config set-cluster cluster --insecure-skip-tls-verify=true --server=http://master:8080
cluster "cluster" set.

コンテキスト(context1)を作成する。ユーザ(user1)とクラスタ(cluster)を関係付ける。
[root@master ~]# kubectl config set-context context1 --user=user1 --cluster=cluster
context "context1" set.

コンテキスト(context2)を作成する。user2 とclusterを関係付ける。
[root@master ~]# kubectl config set-context context2 --user=user2 --cluster=cluster
context "context2" set.

利用するコンテキストを選択する。ここでは、context2を使う。
[root@master ~]# kubectl config use-context context2
switched to context "context2".

現在利用中のコンテキストを確認する。context2であることがわかる。
[root@master ~]# kubectl config get-contexts
CURRENT   NAME       CLUSTER   AUTHINFO   NAMESPACE
*         context2   cluster   user2
          context1   cluster   user1

利用するコンテキストを切り替える(context2->context1)。
[root@master ~]# kubectl config use-context context1
switched to context "context1".

現在利用中のコンテキストを確認する。context1であることがわかる。
[root@master ~]# kubectl config get-contexts
CURRENT   NAME       CLUSTER   AUTHINFO   NAMESPACE
*         context1   cluster   user1
          context2   cluster   user2

設定内容を確認する。設定内容は、~/.kube/configに格納されている。
[root@master ~]# kubectl config view
apiVersion: v1
clusters:
- cluster:
    insecure-skip-tls-verify: true
    server: http://master:8080
  name: cluster
contexts:
- context:
    cluster: cluster
    user: user1
  name: context1
- context:
    cluster: cluster
    user: user2
  name: context2
current-context: context1
kind: Config
preferences: {}
users:
- name: user1
  user:
    password: pass1
    username: user1
- name: user2
  user:
    password: pass2
    username: user2
[root@master ~]#

```


##2.3 コンテキスト、クラスタを削除する方法

```
コンテキストの状態を確認する。"context1"が現在選択されていることがわかる。
[root@master ~]# kubectl config get-contexts
CURRENT   NAME       CLUSTER   AUTHINFO   NAMESPACE
*         context1   cluster   user1
          context2   cluster   user2

コンテキスト(context2)を削除する。
[root@master ~]# kubectl config delete-context context2
deleted context context2 from /root/.kube/config

コンテキストの状態を確認する。context2が削除できたことがわかる。
[root@master ~]# kubectl config get-contexts
CURRENT   NAME       CLUSTER   AUTHINFO   NAMESPACE
*         context1   cluster   user1

もう1つのコンテキスト(context1)も削除する。
[root@master ~]# kubectl config delete-context context1
deleted context context1 from /root/.kube/config

コンテキストの状態を確認する。コンテキストが2つとも削除できたことがわかる。
[root@master ~]# kubectl config get-contexts
CURRENT   NAME      CLUSTER   AUTHINFO   NAMESPACE

設定内容を確認する。クラスタとユーザの設定内容が残っていることがわかる。
[root@master ~]# kubectl config view
apiVersion: v1
clusters:
- cluster:
    insecure-skip-tls-verify: true
    server: http://master:8080
  name: cluster
contexts: []
current-context: context1
kind: Config
preferences: {}
users:
- name: user1
  user:
    password: pass1
    username: user1
- name: user2
  user:
    password: pass2
    username: user2

クラスタの状態を確認する。"cluster"という名前のクラスタが存在することがわかる。
[root@master ~]# kubectl config get-clusters
NAME
cluster

クラスタを削除する。
[root@master ~]# kubectl config delete-cluster cluster
deleted cluster cluster from /root/.kube/config

クラスタの状態を確認する。"cluster"が削除できたことがわかる。
[root@master ~]# kubectl config get-clusters
NAME

設定内容を確認する。クラスタの設定内容が削除できたことがわかる。
[root@master ~]# kubectl config view
apiVersion: v1
clusters: []
contexts: []
current-context: context1
kind: Config
preferences: {}
users:
- name: user1
  user:
    password: pass1
    username: user1
- name: user2
  user:
    password: pass2
    username: user2


ユーザ(user1)を削除する。ユーザ削除の専用コマンドはない模様。
[root@master ~]# kubectl config unset users.user1
property "users.user1" unset.

ユーザ(user2)を削除する。ユーザ削除の専用コマンドはない模様。
[root@master ~]# kubectl config unset users.user2
property "users.user2" unset.

設定内容を確認する。ユーザの設定内容も削除できたことがわかる。
[root@master ~]# kubectl config view
apiVersion: v1
clusters: []
contexts: []
current-context: context1
kind: Config
preferences: {}
users: []

```


#3 指定したホストでPodを動かす方法(taint)
##3.1 参考資料
[Reserving a Kubernetes node for specific pods](https://medium.com/@alejandro.ramirez.ch/reserving-a-kubernetes-node-for-specific-nodes-e75dc8297076#.tn1r9y5zp)
[Annotations](https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/#attaching-metadata-to-objects)
[Taints, Tolerations, and Dedicated Nodes](https://github.com/kubernetes/kubernetes/blob/release-1.4/docs/design/taint-toleration-dedicated.md)

##3.2 実行例
taintとは、指定したホスト(マスタまたはノード）でPodを動かす機能です。
taintの実施例を以下に示します。
- NginxのPod(3個) ==> マスタで動かす。
- HttpdのPod(3個) ==> ノードで動かす。

```
定義ファイルの中身を確認する。NginxのPodを3つ起動します。
[root@master tailnt]# cat nginx-rc.yaml
apiVersion: v1
kind: ReplicationController
metadata:
  name: nginx
spec:
  replicas: 3
  selector:
    app: nginx
  template:
    metadata:
      name: nginx
      labels:
        app: nginx
      annotations:
        scheduler.alpha.kubernetes.io/tolerations: '[{"key":"web", "value":"nginx"}]'
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80

定義ファイルの中身を確認する。httpdのPodを3つ起動します。
[root@master tailnt]# cat httpd-rc.yaml
apiVersion: v1
kind: ReplicationController
metadata:
  name: httpd
spec:
  replicas: 3
  selector:
    app: httpd
  template:
    metadata:
      name: httpd
      labels:
        app: httpd
      annotations:
        scheduler.alpha.kubernetes.io/tolerations: '[{"key":"web", "value":"httpd"}]'
    spec:
      containers:
      - name: httpd
        image: httpd
        ports:
        - containerPort: 80


ホスト（マスタとノード）の名前を確認する。
マスタの名前はmaster、ノードの名前がnode1であることがわかる。
[root@master ~]# kubect
NAME      STATUS    AGE
master    Ready     13d
node1     Ready     13d

マスタにtaintを設定する。
[root@master taint]# kubectl taint nodes master web=nginx:NoSchedule
node "master" tainted

ノードにtaintを設定する。
[root@master taint]# kubectl taint nodes node1 web=httpd:NoSchedule
node "node1" tainted

マスタのtaintを確認する。"web=nginx:NoSchedule"が設定されていることがわかる。
[root@master taint]# kubectl describe node master |grep Taints
Taints:                 web=nginx:NoSchedule

ノードのtaintを確認する。"web=httpd:NoSchedule"が設定されていることがわかる。
[root@master taint]# kubectl describe node node1 |grep Taints
Taints:                 web=httpd:NoSchedule
[root@master taint]#

[root@master tailnt]# ls
httpd-rc.yaml  nginx-rc.yaml

Pod(httpd)を起動する。
[root@master tailnt]# kubectl create -f httpd-rc.yaml
replicationcontroller "httpd" created

Pod(Nginx)を起動する。
[root@master tailnt]# kubectl create -f nginx-rc.yaml
replicationcontroller "nginx" created
[root@master tailnt]#


Podの状態を確認する。マスタで3個動作していることがわかる。
[root@master tailnt]# kubectl get pod -o wide |grep nginx
nginx-40e4n          1/1       Running   0          1m        172.18.10.2   master
nginx-c7z3c          1/1       Running   0          1m        172.18.10.4   master
nginx-qt7kf          1/1       Running   0          1m        172.18.10.3   master

Podの状態を確認する。ノードで3個動作していることがわかる。
[root@master tailnt]# kubectl get pod -o wide |grep httpd
httpd-8o9qr          1/1       Running   0          1m        172.18.20.3   node1
httpd-lt6ns          1/1       Running   0          1m        172.18.20.5   node1
httpd-nutj7          1/1       Running   0          1m        172.18.20.4   node1
[root@master tailnt]#


あと始末をする。NginxとHttpdのPodを終了する。
[root@master taint]# kubectl delete -f nginx-rc.yaml
replicationcontroller "nginx" deleted
[root@master taint]# kubectl delete -f httpd-rc.yaml
replicationcontroller "httpd" deleted
[root@master taint]#

Podの状態を確認する。NginxもHttpdも終了したことがわかる。
[root@master tailnt]# kubectl get pod -o wide |grep httpd
[root@master tailnt]#

マスタからtaintを削除する。
[root@master tailnt]# kubectl taint nodes master web-
node "master" tainted

ノードからtaintを削除する。
[root@master tailnt]# kubectl taint nodes node1 web-
node "node1" tainted


[root@master tailnt]# kubectl describe node master |grep Taints
Taints:                 <none>
[root@master tailnt]# kubectl describe node node1 |grep Taints
Taints:                 <none>
[root@master tailnt]#

```

#4 Ingress
##4.1 参考情報
[Exposing Services using Ingress with On-Prem Kubernetes Clusters](https://medium.com/@rothgar/exposing-services-using-ingress-with-on-prem-kubernetes-clusters-f413d87b6d34)
[Kubernetes, Ingress controllers and Traefik](https://hackernoon.com/kubernetes-ingress-controllers-and-traefik-a32648a4ae95)

##4.2 Ingressコントローラとは?
FQDNをserviceのアドレスに変換する機能。
ここでは、traefikというIngressコントローラを使います。
他に、nginxのIngressコントローラがあるようです。

##4.3 実行例

```
Podを起動する。
[root@master ingress]# kubectl run microbot --image=dontrebootme/microbot:v1 --port=80
deployment "microbot" created

Podの状態を確認する。
[root@master ingress]# kubectl get pod --all-namespaces
NAMESPACE   NAME                        READY     STATUS    RESTARTS   AGE
default     microbot-2423440873-mgf5i   1/1       Running   0          42s

サービスを作成する。
[root@master ingress]# kubectl expose deployment microbot --port=80 --target-port=80 --type=NodePort
service "microbot" exposed

サービスを確認する。
[root@master ingress]# kubectl get svc --all-namespaces
NAMESPACE   NAME         CLUSTER-IP      EXTERNAL-IP   PORT(S)         AGE
default     kubernetes   10.254.0.1      <none>        443/TCP         29d
default     microbot     172.18.254.97   <nodes>       80/TCP          10s

サービスに対してcurlを実行する。
[root@master ingress]# curl http://172.18.254.97:80
<!DOCTYPE html>
<html>
  <style type="text/css">
    .centered
      {
      text-align:center;
      margin-top:0px;
      margin-bottom:0px;
      padding:0px;
      }
-以下、略-

Ingressコントローラのyamlファイルをダウンロードする。
[root@master ingress]# wget https://raw.githubusercontent.com/containous/traefik/master/examples/k8s/traefik.yaml
-以下、略-

ファイルを確認する。
[root@master ingress]# ls
traefik.yaml

IngressコントローラのDeploymenを確認する。
[root@master ingress]# cat traefik.yaml
apiVersion: v1
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
  name: traefik-ingress-controller
  namespace: kube-system
  labels:
    k8s-app: traefik-ingress-lb
spec:
  replicas: 1
  selector:
    matchLabels:
      k8s-app: traefik-ingress-lb
  template:
    metadata:
      labels:
        k8s-app: traefik-ingress-lb
        name: traefik-ingress-lb
    spec:
      terminationGracePeriodSeconds: 60
      hostNetwork: true
      containers:
      - image: traefik
        name: traefik-ingress-lb
        resources:
          limits:
            cpu: 200m
            memory: 30Mi
          requests:
            cpu: 100m
            memory: 20Mi
        ports:
        - name: http
          containerPort: 80
          hostPort: 80
        - name: admin
          containerPort: 8081
        args:
        - -d
        - --web
        - --web.address=:8081
        - --kubernetes
[root@master ingress]#

Pod(Ingressコントローラ)を起動する。
[root@master ingress]# kubectl create -f traefik.yaml
deployment "traefik-ingress-controller" created

状態を確認する(★印)
[root@master ingress]# kubectl get pod --all-namespaces
NAMESPACE     NAME                                         READY     STATUS    RESTARTS   AGE
default       microbot-2423440873-mgf5i                    1/1       Running   0          21m
kube-system ★traefik-ingress-controller-173142729-vmhav   1/1       Running   0          31s

Ingressのyamlファイルをダウンロードする。
[root@master ingress]# wget https://gist.githubusercontent.com/rothgar/a04d6d9bb3faec3d59f36584c3bfc6f2/raw/392a7fdf2ef77241fd2f18a617f70fb803b82891/microbot.ing.yaml
-以下、略-

ファイルを確認する(★印)。
[root@master ingress]# ls
★microbot.ing.yaml  traefik.yaml

Ingressのyamlファイルの中身を確認する。
[root@master ingress]# cat microbot.ing.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
 name: microbot-ingress
spec:
 rules:
   - host: microbot
     http:
       paths:
         - path: /
           backend:
             serviceName: microbot
             servicePort: 80

Ingressを作成する。
[root@master ingress]# kubectl create -f microbot.ing.yaml
ingress "microbot-ingress" created

作成したIngressを確認する。
[root@master ingress]# kubectl get ingress --all-namespaces
NAMESPACE   NAME               HOSTS      ADDRESS   PORTS     AGE
default     microbot-ingress   microbot             80        7s

[root@master ingress]# curl -L --resolve microbot:80:172.18.254.97 http://microbot
<!DOCTYPE html>
<html>
  <style type="text/css">
    .centered
      {
      text-align:center;
      margin-top:0px;
      margin-bottom:0px;
      padding:0px;
      }
  </style>
-以下、略-

```


#5 heapsterの起動方法
##5.1 前提
SKyDNSが動作していることが前提条件です。

##5.2 定義ファイル(yaml)のダウンロード
下記サイトより、heapsterとinfluxdbの定義ファイルをダウンロードする。
https://github.com/kubernetes/heapster/tree/master/deploy/kube-config/influxdb

```
ダウンロードしたファイルを確認する。
[root@master autoscale]# ls
heapster-deployment.yaml  influxdb-deployment.yaml
heapster-service.yaml     influxdb-service.yaml

```


##5.3 heapsterの定義ファイル
heapsterのServiceとDeploymentの定義ファイルの中身を確認する。
Serviceは修正せず、そのまま使用しています。
Deploymentは、2行変更（コメント行参照)

```
[root@master autoscale]# cat heapster-service.yaml
apiVersion: v1
kind: Service
metadata:
  labels:
    task: monitoring
    # For use as a Cluster add-on (https://github.com/kubernetes/kubernetes/tree/master/cluster/addons)
    # If you are NOT using this as an addon, you should comment out this line.
    kubernetes.io/cluster-service: 'true'
    kubernetes.io/name: Heapster
  name: heapster
  namespace: kube-system
spec:
  ports:
  - port: 80
    targetPort: 8082
  selector:
    k8s-app: heapster
[root@master autoscale]#

[root@master autoscale]# cat heapster-deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: heapster
  namespace: kube-system
spec:
  replicas: 1
  template:
    metadata:
      labels:
        task: monitoring
        k8s-app: heapster
    spec:
      containers:
      - name: heapster
        image: gcr.io/google_containers/heapster-amd64:v1.3.0-beta.1
        imagePullPolicy: IfNotPresent
        command:
        - /heapster
        #- --source=kubernetes:https://kubernetes.default
        - --source=kubernetes:http://master:8080?inClusterConfig=false
        #- --sink=influxdb:http://monitoring-influxdb:8086
        - --sink=influxdb:http://monitoring-influxdb.kube-system.svc.cluster.local:8086
```


##5.4 influxdbの定義ファイル
influxdbのServiceとDeploymentの定義ファイルの中身を確認する。
influxdbの定義ファイルはとくに修正していません。

```
[root@master autoscale]# cat influxdb-service.yaml
apiVersion: v1
kind: Service
metadata:
  labels:
    task: monitoring
    # For use as a Cluster add-on (https://github.com/kubernetes/kubernetes/tree/master/cluster/addons)
    # If you are NOT using this as an addon, you should comment out this line.
    kubernetes.io/cluster-service: 'true'
    kubernetes.io/name: monitoring-influxdb
  name: monitoring-influxdb
  namespace: kube-system
spec:
  ports:
  - port: 8086
    targetPort: 8086
  selector:
    k8s-app: influxdb

[root@master autoscale]# cat influxdb-deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: monitoring-influxdb
  namespace: kube-system
spec:
  replicas: 1
  template:
    metadata:
      labels:
        task: monitoring
        k8s-app: influxdb
    spec:
      containers:
      - name: influxdb
        image: gcr.io/google_containers/heapster-influxdb-amd64:v1.1.1
        volumeMounts:
        - mountPath: /data
          name: influxdb-storage
      volumes:
      - name: influxdb-storage
        emptyDir: {}
```


##5.5 Podとサービスの起動
influxdb,heapsterのPodの起動と、サービスの作成をします。

```
influxdbのDeploymentとServiceを作成する。
[root@master autoscale]# kubectl create -f influxdb-deployment.yaml
deployment "monitoring-influxdb" created
[root@master autoscale]# kubectl create -f influxdb-service.yaml
service "monitoring-influxdb" created

heapsterのDeploymentとServiceを作成する。
[root@master autoscale]# kubectl create -f heapster-deployment.yaml
deployment "heapster" created
[root@master autoscale]# kubectl create -f heapster-service.yaml
service "heapster" created

Podの状態を確認する。
[root@master autoscale]# kubectl get pod --all-namespaces -o wide
NAMESPACE     NAME                                  READY     STATUS    RESTARTS   AGE       IP            NODE
kube-system   heapster-681962116-9gtal              1/1       Running   0          16m       172.18.10.4   master
kube-system   kube-dns-v11-n4zme                    4/4       Running   0          22m       172.18.10.2   master
kube-system   monitoring-influxdb-421024531-scb9c   1/1       Running   0          16m       172.18.10.3   master

サービスの状態を確認する。
[root@master autoscale]# kubectl get svc --all-namespaces
NAMESPACE     NAME                  CLUSTER-IP       EXTERNAL-IP   PORT(S)         AGE
default       kubernetes            172.18.254.1     <none>        443/TCP         10d
kube-system   heapster              172.18.254.125   <none>        80/TCP          28m
kube-system   kube-dns              172.18.254.10    <none>        53/UDP,53/TCP   34m
kube-system   monitoring-influxdb   172.18.254.103   <none>        8086/TCP        28m

heapsterのログを確認すると、下記エラーメッセージが繰り返し出力されている。influxdbの方はエラーは出ていない。
このエラーが原因でkubectl top podが正常に動作していないのか???
192.168.3.1:53はISPのキャッシュDNSサーバのIPアドレスなんですけどね。。誰か原因わからないですかね???
[root@master autoscale]# kubectl logs heapster-681962116-9gtal --namespace=kube-system 
E0423 08:34:52.522008       1 reflector.go:203] k8s.io/heapster/metrics/sources/kubelet/kubelet.go:342: Failed to list *api.Node: Get http://master:8080/api/v1/nodes?resourceVersion=0: dial tcp: lookup master on 192.168.3.1:53: read udp 172.18.10.4:48598->192.168.3.1:53: read: :
-以下、略-

```


#6 Autoscale
##6.1 参考情報
[Horizontal Pod Autoscaling Walkthrough](https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/)
[Edit This Page
Horizontal Pod Autoscaling](https://kubernetes.io/docs/user-guide/horizontal-pod-autoscaling/walkthrough/)

##6.2 Autoscaleを使うために必要なPod
Kubernetesの公式ページによると、HeapsterというPodが必要である旨の説明がある。
https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/

>
This example requires a running Kubernetes cluster and kubectl, version 1.2 or later. 
Heapster monitoring needs to be deployed in the cluster as Horizontal Pod Autoscaler uses it to collect metrics 
(if you followed getting started on GCE guide, heapster monitoring will be turned-on by default).

[kubernetesの認証とアクセス制御を動かしてみる](https://ishiis.net/2017/01/21/kubernetes-authentication-authorization/)