Kubernetes笔记
概要: 提供以下内容的概括
由于Kubernetes很复杂,所以我将逐步记录下我调查到的内容。
-
- 名前解決は利用せず、IPアドレスのみ使う
-
- masterはmaster nodeと呼ばれることもある
-
- nodeはworker nodeと呼ばれる
昔はminionとも呼ばれていた(今も?)
安装的过程
順番
etcd (masterのみ)
masterとは別のetcdサーバでも問題ないが、masterに入れられる事がほとんど
nodeはetcdサーバから情報を取得するだけなのでnode自体にetcdは入って無くても良い
flanneld
docker
kubernetes
etcd (masterのみ)
/etc/etcd/etcd.conf
ETCD_LISTEN_CLIENT_URLS=”http://10.136.3.183:2379,http://localhost:2379″
ETCD_ADVERTISE_CLIENT_URLS=”http://localhost:2379″
flanneld
/etc/sysconfig/flanneld (master,node共通)
FLANNEL_ETCD_ENDPOINTS=”http://10.136.3.183:2379″
FLANNEL_ETCD_PREFIX=”/flannel/network”
关于etcd
-
- 分散Key-Valuesストアを使い各種設定をノード間で共有するメカニズム
Key-Valuesストアデータは、ディレクトリ構造(=パス)で管理されている
Linuxの実際のディレクトリは別物。あくまでディレクトリ構造で管理されているということ
Kubernetesでの用途
flannelやSkyDNS、その他関連コンポーネントのデータストア
通过命令进行确认
在安装和构建master和node的过程完成后进行确认。除了网络之外,容器的信息似乎也在etcd中进行管理,但为了简单起见,在这里不写明。
### インストール時、以下のコマンドでconfigを作成済み
$ sudo /usr/bin/etcdctl mk /flannel/network/config {"Network":"172.17.0.0/16"}
[10.136.3.183(master)]
### 状態の確認
$ etcdctl cluster-health
================================================
member 8e9e05c52164694d is healthy: got healthy result from http://localhost:2379
cluster is healthy
================================================
-> memberはmasterのみ
### ディレクトリ構造の確認
$ etcdctl ls
================================================
/flannel
================================================
$ etcdctl ls /flannel --recursive -p
================================================
/flannel/network/
/flannel/network/config
/flannel/network/subnets/
/flannel/network/subnets/172.17.3.0-24
/flannel/network/subnets/172.17.67.0-24
/flannel/network/subnets/172.17.98.0-24
================================================
--recursive : 再帰的に表示
-p : ディレクトリの場合は後ろに「/」が付く
### キーバリューの確認
$ etcdctl get /flannel/network/config
================================================
{"Network":"172.17.0.0/16"}
================================================
-> このレンジのアドレスが各ホストにアサインされる
$ etcdctl get /flannel/network/subnets/172.17.3.0-24
================================================
{"PublicIP":"10.136.3.184"}
================================================
-> 10.136.3.184のホストはこのIPレンジがアサインされる
$ etcdctl get /flannel/network/subnets/172.17.67.0-24
================================================
{"PublicIP":"10.136.3.185"}
================================================
$ etcdctl get /flannel/network/subnets/172.17.98.0-24
================================================
{"PublicIP":"10.136.3.183"}
================================================
### nodeで値を取得
[10.136.3.184(node1)]
$ curl http://10.136.3.183:2379/v2/keys
================================================
{"action":"get","node":{"dir":true,"nodes":[{"key":"/flannel","dir":true,"modifiedIndex":4,"createdIndex":4}]}}
================================================
$ curl http://10.136.3.183:2379/v2/keys/flannel/network/subnets/172.17.3.0-24 | jq
================================================
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 214 100 214 0 0 199k 0 --:--:-- --:--:-- --:--:-- 208k
{
"action": "get",
"node": {
"key": "/flannel/network/subnets/172.17.3.0-24",
"value": "{\"PublicIP\":\"10.136.3.184\"}",
"expiration": "2017-04-22T09:47:54.099017257Z",
"ttl": 21188,
"modifiedIndex": 2425,
"createdIndex": 2425
}
}
================================================
将key的范围分配给value的主机。
请找出下列句子在中文中的本地化表达:
参考
- etcd概要
有关flanneld
-
- flanneldが無い場合
あるホストで稼働するコンテナに、別のホストで稼働しているコンテナからブリッジネットワーク経由でアクセスできない
docker network lsでbridgeと表示されるネットワーク
docker0(よくある172.17.〜)のネットワーク
flanneldは各ホストで起動しているデーモンプロセス
flanneldにより各コンテナで一意なアドレスを持つようにできる
ホスト間のコーディネーションのような仕組みではない
同じデータストアでルーティングテーブルを共有しているだけ
データストアはetcdが使われることが多い
flanneldのネットワークはプライベートなアドレス
Kubernetesの外側からは叩け無い
Kubernetesのサービスのネットワークも別物
これもKubernetesの外側からは叩けない(そもそもifocnfigやipで確認できない)
通过命令完成确认
每个主机都被分配与在etcd中确认的相同网络。
[10.136.3.183(master)]
$ cat /run/flannel/docker
================================================
DOCKER_OPT_BIP="--bip=172.17.98.1/24"
DOCKER_OPT_IPMASQ="--ip-masq=true"
DOCKER_OPT_MTU="--mtu=1472"
DOCKER_NETWORK_OPTIONS=" --bip=172.17.98.1/24 --ip-masq=true --mtu=1472"
================================================
$ cat /run/flannel/subnet.env
================================================
FLANNEL_NETWORK=172.17.0.0/16
FLANNEL_SUBNET=172.17.98.1/24
FLANNEL_MTU=1472
FLANNEL_IPMASQ=false
================================================
$ ip a
================================================
...
3: flannel0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1472 qdisc pfifo_fast state UNKNOWN qlen 500
link/none
inet 172.17.98.0/16 scope global flannel0
valid_lft forever preferred_lft forever
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN
link/ether 02:42:d6:c1:17:ba brd ff:ff:ff:ff:ff:ff
inet 172.17.98.1/24 scope global docker0
valid_lft forever preferred_lft forever
================================================
$ netstat -rn
================================================
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
0.0.0.0 10.136.2.3 0.0.0.0 UG 0 0 0 eno16780032
10.136.0.0 0.0.0.0 255.255.128.0 U 0 0 0 eno16780032
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 flannel0
172.17.98.0 0.0.0.0 255.255.255.0 U 0 0 0 docker0
================================================
[10.136.3.184(node1)]
$ cat /run/flannel/docker
================================================
DOCKER_OPT_BIP="--bip=172.17.3.1/24"
DOCKER_OPT_IPMASQ="--ip-masq=true"
DOCKER_OPT_MTU="--mtu=1472"
DOCKER_NETWORK_OPTIONS=" --bip=172.17.3.1/24 --ip-masq=true --mtu=1472"
================================================
$ cat /run/flannel/subnet.env
================================================
FLANNEL_NETWORK=172.17.0.0/16
FLANNEL_SUBNET=172.17.3.1/24
FLANNEL_MTU=1472
FLANNEL_IPMASQ=false
================================================
$ ip a
================================================
3: flannel0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1472 qdisc pfifo_fast state UNKNOWN qlen 500
link/none
inet 172.17.3.0/16 scope global flannel0
valid_lft forever preferred_lft forever
4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1472 qdisc noqueue state UP
link/ether 02:42:b3:f5:03:12 brd ff:ff:ff:ff:ff:ff
inet 172.17.3.1/24 scope global docker0
valid_lft forever preferred_lft forever
================================================
$ netstat -rn
================================================
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
0.0.0.0 10.136.2.3 0.0.0.0 UG 0 0 0 eno16780032
10.136.0.0 0.0.0.0 255.255.128.0 U 0 0 0 eno16780032
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 flannel0
172.17.3.0 0.0.0.0 255.255.255.0 U 0 0 0 docker0
================================================
[10.136.3.185(node2)]
$ cat /run/flannel/docker
================================================
DOCKER_OPT_BIP="--bip=172.17.67.1/24"
DOCKER_OPT_IPMASQ="--ip-masq=true"
DOCKER_OPT_MTU="--mtu=1472"
DOCKER_NETWORK_OPTIONS=" --bip=172.17.67.1/24 --ip-masq=true --mtu=1472"
================================================
$ cat /run/flannel/subnet.env
================================================
FLANNEL_NETWORK=172.17.0.0/16
FLANNEL_SUBNET=172.17.67.1/24
FLANNEL_MTU=1472
FLANNEL_IPMASQ=false
================================================
$ ip a
================================================
3: flannel0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1472 qdisc pfifo_fast state UNKNOWN qlen 500
link/none
inet 172.17.67.0/16 scope global flannel0
valid_lft forever preferred_lft forever
4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1472 qdisc noqueue state UP
link/ether 02:42:2c:d9:cf:88 brd ff:ff:ff:ff:ff:ff
inet 172.17.67.1/24 scope global docker0
valid_lft forever preferred_lft forever
================================================
$ netstat -rn
================================================
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
0.0.0.0 10.136.2.3 0.0.0.0 UG 0 0 0 eno16780032
10.136.0.0 0.0.0.0 255.255.128.0 U 0 0 0 eno16780032
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 flannel0
172.17.67.0 0.0.0.0 255.255.255.0 U 0 0 0 docker0
================================================
### master(10.136.3.183)からnode2(10.136.3.185)のコンテナ(172.17.67.2)に疎通確認
[10.136.3.183]
$ ping 172.17.67.2
================================================
PING 172.17.67.2 (172.17.67.2) 56(84) bytes of data.
64 bytes from 172.17.67.2: icmp_seq=1 ttl=61 time=0.574 ms
64 bytes from 172.17.67.2: icmp_seq=2 ttl=61 time=0.422 ms
64 bytes from 172.17.67.2: icmp_seq=3 ttl=61 time=0.256 ms
================================================
## 參考
- CoreOS + flannel で複数ホスト間コンテナ通信をする
关于Kubernetes
管理Docker容器虚拟化的框架
-
- Kubernetesがやること
複数のコンテナをデプロイ
どのホストにどのコンテナを配備するかを隠蔽
コンテナ間のネットワーク管理(名前空間含む)
サービスディスカバリ相当
コンテナの死活管理
コンテナが死んだら自動で起動
コンテナの負荷分散
同一機能の複数コンテナへのアクセスをバランシング
コンテナのリソースアロケーション
コンテナ毎にCPUやメモリのわりあて
ひとつのプロセスで動くプロセスの数を最小限にして、代わりにコンテナ群を管理する
理屈で言えばコンテナは1つのOS相当なので複数のサービスを動かす事ができる
簡易化のためにここでは1コンテナ1プロセス
使用词汇
-
- Pod
1つ以上のコンテナの集まり
複数のコンテナがある場合は共有されたボリュームも管理する
Pod内のコンテナは必ず同じホスト
Label
Podにつけるラベル
例) Production、Development、Staging、Frontend、Backendなど
複数ラベルが付けられる
ReplicaSet
Podを生成、管理する
PodTemplateから指定された数のレプリカを作成して維持する
起動中のPodの監視をしていて何らかの原因でPodが減ったり増えたりしたら、元の数に戻す
Replication Controllerの後継
Deployment
ReplicaSetを生成、管理
デプロイ管理
ローリングアップデート
古いバージョンのコンテナから新しいバージョンのコンテナに徐々に置き換えていくなど
新旧のPod共に共通するラベルを持っており、Serviceを通して新旧混ざった状態でサービスを提供できる
ロールバック
ローリングアップデート後もアップデート前のReplicaSetは一定数保持される
Kubernetes: Deployment の仕組み
Service
L3のプロキシみたいな役割
設定したPodにラウンドロビンでアクセスを分配する
组件
-
- master
kube-apiserver
Kubernetesのリソースを管理するAPIサーバー
etcd
kube-controller-manager
各種コントローラーを起動し管理するマネージャー
Node Controller: ノードが落ちたときにアラートを出したら何か処理をする
Replication Controller: Podがちゃんと定められた数稼働しているかなどを管理する
Endpoints Controller: エンドポイントを移したりする
Service Account & Token Controllers: デフォルトアカウントを作ったり新しいnamespaceにアクセストークンを作ったりする
cloud-controller-manager
クラウドプロバイダとやりとりするマネージャー
Kubernetes 1.6から
kube-scheduler
Podのノードへの割り当てを行うスケジューラー
DNS
node
kubelet
Podを起動し管理するエージェント(Nodeのメイン処理)
kube-proxy
KubernetesのServiceが持つ仮想的なIPアドレス(cluster IP)へのアクセスをルーティングする
client
kubectl
KubernetesのCLIクライアント
命令
部署相关
部署
### --record : kubectlのコマンドをアノテーションに保存
$ kubectl create -f deployment-example.yaml --record
================================================
deployment "deployment-example" created
================================================
### 設定したラベルを指定して関連リソース
### --selector : ラベルを指定するオプション
### app=<lavel>
$ kubectl get deployments,replicasets,pods --selector app=deployment-example
================================================
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
deploy/deployment-example 2 2 2 0 33s
NAME DESIRED CURRENT READY AGE
rs/deployment-example-2748039730 2 2 0 33s
NAME READY STATUS RESTARTS AGE
po/deployment-example-2748039730-2q8vr 0/1 ContainerCreating 0 33s
po/deployment-example-2748039730-sm7z3 0/1 ContainerCreating 0 33s
================================================
滚动更新
### deployment-exampleの中身をさっきと変更して実行
$ kubectl apply -f deployment-example.yaml --record
================================================
deployment "deployment-example" configured
================================================
### ローリングアップデートされている様子を表示
$ kubectl get deployments,replicasets,pods --selector app=deployment-example
================================================
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
deploy/deployment-example 2 3 2 1 11m
NAME DESIRED CURRENT READY AGE
rs/deployment-example-2748039730 1 1 1 11m
rs/deployment-example-2829304371 2 2 0 20s
NAME READY STATUS RESTARTS AGE
po/deployment-example-2748039730-2q8vr 1/1 Running 0 11m
po/deployment-example-2829304371-gnrf2 0/1 ContainerCreating 0 20s
po/deployment-example-2829304371-wmds5 0/1 ContainerCreating 0 20s
================================================
### ローリングアップデート完了後
$ kubectl get deployments,replicasets,pods --selector app=deployment-example
================================================
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
deploy/deployment-example 2 2 2 2 16m
NAME DESIRED CURRENT READY AGE
rs/deployment-example-2748039730 0 0 0 16m
rs/deployment-example-2829304371 2 2 2 5m
NAME READY STATUS RESTARTS AGE
po/deployment-example-2829304371-gnrf2 1/1 Running 0 5m
po/deployment-example-2829304371-wmds5 1/1 Running 0 5m
================================================
回滚
### デプロイの履歴を表示
$ kubectl rollout history deployment deployment-example
================================================
REVISION CHANGE-CAUSE
1 kubectl create -f deployment-example.yaml --record
2 kubectl apply -f deployment-example.yaml --record
================================================
### リビジョンの詳細確認
$ kubectl rollout history deployment deployment-example --revision=1
================================================
deployments "deployment-example" with revision #1
Labels: app=deployment-example
pod-template-hash=2748039730
Annotations: kubernetes.io/change-cause=kubectl create -f deployment-example.yaml --record
Containers:
nginx:
Image: nginx:1.10
Port: 80/TCP
Volume Mounts: <none>
Environment Variables: <none>
No volumes.
================================================
### リビジョンを指定してロールバックを実行
### 指定しない場合は一つ前のリビジョンになる
$ kubectl rollout undo deployment deployment-example --to-revision=1
================================================
deployment "deployment-example" rolled back
================================================
### 前のバージョンに戻ったことを確認
$ kubectl get deployments,replicasets,pods --selector app=deployment-example
================================================
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
deploy/deployment-example 2 2 2 2 34m
NAME DESIRED CURRENT READY AGE
rs/deployment-example-2748039730 2 2 2 34m
rs/deployment-example-2829304371 0 0 0 23m
NAME READY STATUS RESTARTS AGE
po/deployment-example-2748039730-0rcn0 1/1 Running 0 1m
po/deployment-example-2748039730-44h4v 1/1 Running 0 1m
================================================
Pod相关
### 全てのネームスペースのポッドの情報を表示
$ kubectl get pods --all-namespaces
================================================
NAMESPACE NAME READY STATUS RESTARTS AGE
default deployment-example-2829304371-gnrf2 1/1 Running 0 10m
default deployment-example-2829304371-wmds5 1/1 Running 0 10m
joruri joruri-ldap-centos7 1/1 Running 0 1d
kube-system kubernetes-dashboard-4108885099-mc042 1/1 Running 0 2d
================================================
### Podの詳細情報を表示
$ kubectl describe pods --selector=app=deployment-example
================================================
Name: deployment-example-2829304371-gnrf2
Namespace: default
Node: 10.136.3.185/10.136.3.185
Start Time: Sun, 23 Apr 2017 20:12:10 +0900
Labels: app=deployment-example
pod-template-hash=2829304371
Status: Running
IP: 172.17.67.3
Controllers: ReplicaSet/deployment-example-2829304371
Containers:
nginx:
Container ID: docker://c4c539fb48f5a15b45f375eee0cfef4bd00039dc2fb2a75c9188e5e26d1db047
Image: nginx:1.11
Image ID: docker-pullable://docker.io/nginx@sha256:e6693c20186f837fc393390135d8a598a96a833917917789d63766cab6c59582
Port: 80/TCP
State: Running
Started: Sun, 23 Apr 2017 20:12:48 +0900
Ready: True
Restart Count: 0
Volume Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-wpzd6 (ro)
Environment Variables: <none>
Conditions:
Type Status
Initialized True
Ready True
PodScheduled True
Volumes:
default-token-wpzd6:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-wpzd6
QoS Class: BestEffort
Tolerations: <none>
Events:
FirstSeen LastSeen Count From SubObjectPath Type Reason Message
--------- -------- ----- ---- ------------- -------- ------ -------
17m 17m 1 {default-scheduler } Normal Scheduled Successfully assigned deployment-example-2829304371-gnrf2 to 10.136.3.185
17m 17m 1 {kubelet 10.136.3.185} spec.containers{nginx} Normal Pulling pulling image "nginx:1.11"
16m 16m 1 {kubelet 10.136.3.185} spec.containers{nginx} Normal Pulled Successfully pulled image "nginx:1.11"
16m 16m 1 {kubelet 10.136.3.185} spec.containers{nginx} Normal Created Created container with docker id c4c539fb48f5; Security:[seccomp=unconfined]
16m 16m 1 {kubelet 10.136.3.185} spec.containers{nginx} Normal Started Started container with docker id c4c539fb48f5
Name: deployment-example-2829304371-wmds5
Namespace: default
Node: 10.136.3.184/10.136.3.184
Start Time: Sun, 23 Apr 2017 20:12:10 +0900
Labels: app=deployment-example
pod-template-hash=2829304371
Status: Running
IP: 172.17.3.4
Controllers: ReplicaSet/deployment-example-2829304371
Containers:
nginx:
Container ID: docker://f9c7a7f709aa846993f4ac6c2da5ac3ad78ad09f012b8902c9a3d37668254068
Image: nginx:1.11
Image ID: docker-pullable://docker.io/nginx@sha256:e6693c20186f837fc393390135d8a598a96a833917917789d63766cab6c59582
Port: 80/TCP
State: Running
Started: Sun, 23 Apr 2017 20:12:45 +0900
Ready: True
Restart Count: 0
Volume Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-wpzd6 (ro)
Environment Variables: <none>
Conditions:
Type Status
Initialized True
Ready True
PodScheduled True
Volumes:
default-token-wpzd6:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-wpzd6
QoS Class: BestEffort
Tolerations: <none>
Events:
FirstSeen LastSeen Count From SubObjectPath Type Reason Message
--------- -------- ----- ---- ------------- -------- ------ -------
17m 17m 1 {default-scheduler } Normal Scheduled Successfully assigned deployment-example-2829304371-wmds5 to 10.136.3.184
17m 17m 1 {kubelet 10.136.3.184} spec.containers{nginx} Normal Pulling pulling image "nginx:1.11"
16m 16m 1 {kubelet 10.136.3.184} spec.containers{nginx} Normal Pulled Successfully pulled image "nginx:1.11"
16m 16m 1 {kubelet 10.136.3.184} spec.containers{nginx} Normal Created Created container with docker id f9c7a7f709aa; Security:[seccomp=unconfined]
16m 16m 1 {kubelet 10.136.3.184} spec.containers{nginx} Normal Started Started container with docker id f9c7a7f709aa
================================================
定义示例
部署
apiVersion: extensions/v1beta1 ### ※1 Kubernetes APIのバージョンで変わる
kind: Deployment ### オブジェクトの種類を指定
metadata:
name: nginx-deployment ### Deploymentの名前。Namespace内ではユニークである必要がある
spec:
replicas: 2 ### レプリカ数の指定
template: ### Podのテンプレート(PodTemplate)
metadata:
labels:
app: nginx-deployment ### ラベル指定は必須
spec:
containers:
- name: nginx
image: nginx:1.10
ports:
- containerPort: 80 ### コンテナ側の待ち受けport
-
- ※1 Kubernetes API Overview を参照
Kubernetes API 1.5 は apiVersion: extensions/v1beta1
Kubernetes API 1.6 は apiVersion: apps/v1beta1
kubectl –version でKubernetesのバージョンを確認できる
この環境の実行結果は Kubernetes v1.5.2 なので apiVersion: extensions/v1beta1
命名空间
请提供更多上下文信息,这样才能提供更准确的翻译。常见的含义有:参考书籍、参考资料或参考建议等。
-
- Kubernetesにまつわるエトセトラ
- Kubernetes: 構成コンポーネント一覧