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
Annotations
Taints, Tolerations, and Dedicated Nodes
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
Kubernetes, Ingress controllers and Traefik
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
Edit This Page
Horizontal Pod Autoscaling
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).