Kubernetesクラスタ導入2
1.etcdクラスタの構成と有効化
A.起動項目を構成し、起動項目を他のノードに配布する
B.etcdの作業ディレクトリとデータディレクトリを指定する
C.etcdを配置する.confプロファイルを他のノードに配布
D.etcdクラスタの起動
注意:最初のetcdノードは、他のノードの生存状態が検出されなかったため、起動に失敗しました.
E.クラスタメンバーの表示
F.クラスタの健康状態の表示
2.flanneldの構成と有効化
A.起動項目を構成し、他のノードに配布する
B.flannelプロファイルを構成し、他のノードに配布する
C.etcdストレージを使用してflannelのディレクトリを作成し、ネットワーク構成を追加する
D.flanneldを起動する
E.各ノードセグメントの表示
F.dockerセグメントがflannelに割り当てられたセグメントを変更する
G.該当するセグメントが割り当てられているかどうかを確認する
H.etcdctlコマンドを使用してflannelに関する情報を表示する
I.ネットワークが正常かどうかをテストする
3.Kubernetes Masterノードの構成と有効化
Kubernetes Masterノードに含まれるコンポーネント:
kube-apiserver
kube-controller-manager
kube-scheduler
A.configファイルを構成し、すべてのノードに配布する
B.kube-apiserver起動項目の構成
C.apiserverプロファイルの構成
D.アクセスユーザの設定
フォーマット:ユーザー名、パスワード、UID
E.kube-apiserverの起動
F.adminユーザをclusterrole:cluster-adminにバインドして検証する
G.kube-controller-manager起動項目の構成
H.kube-controller-managerプロファイルの構成
I.kube-controller-managerを起動する
J.kube-scheduler起動項目の構成
K.kube-schedulerプロファイルの構成
L.kube-schedulerを起動する
M.Masterノードの検証
4.Kubernetesノードの構成と有効化
Kubernetesノードには、次の項目があります.
kubelet
kube-proxy
A.クbeletに権限を与えてクbeletデータディレクトリを新規作成する
kubelet起動時にkube-apiserverにTLS bootstrappingリクエストを送信するには、bootstrap tokenファイルのkubelet-bootstrapユーザーにsystem:node-bootstrapper clusterロール(role)を付与してから、kubeletが認証リクエスト(certificate signing requests)を作成する権限を持つ必要があります.
Master:
B.クbelet起動項目を構成し、nodeノードに配布する
C.クbeletプロファイルの設定
D.クbeletを起動する
E.ノードをKubernetesクラスタに追加
kubeletは、最初の起動時にkube-apiserverに証明書署名要求を送信し、クラスタにノードを追加するにはMaster認証が必要です.
注意:CSR認証後、ノード側で自動的にクbeletクbeconfigプロファイルと公開鍵が生成されます.
F.kube-proxy起動項目を構成し、他のnodeノードに配布する
G.カーネルパラメータの調整
説明:このパラメータを追加したのはkube-proxyがiptablesを使用してデータ転送を行うためで、Linuxシステムはデフォルトでパケット転送を禁止しています.ここではnodeportを使用できないため発見しました.
H.kube-proxyプロファイルを構成し、他のnodeノードに配布する
I.kube-proxyを起動する
J.ノード関連情報の表示
説明:他のコマンドはkubectl--helpを使用して表示できます.一部の長いコマンドは、kubectl get namespaceがkubectl get nsと略記できるなど、kubectlコマンドテーブルの参照は次のとおりです.
http://docs.kubernetes.org.cn/683.html
A.起動項目を構成し、起動項目を他のノードに配布する
# vim /usr/lib/systemd/system/etcd.service
[Unit]
Description=etcd
After=network.target
After=network-online.target
Wants=network-online.target
Documentation=
[Service]
Type=notify
WorkingDirectory=/var/lib/etcd
EnvironmentFile=-/etc/etcd/etcd.conf
ExecStart=/usr/bin/etcd --config-file /etc/etcd/etcd.conf
Restart=on-failure
RestartSec=5
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
# ansible node -m copy -a 'src=/usr/lib/systemd/system/etcd.service dest=/usr/lib/systemd/system/'
B.etcdの作業ディレクトリとデータディレクトリを指定する
# mkdir -p /var/lib/etcd/ && mkdir -p /etc/etcd
# ansible node -m file -a 'path=/var/lib/etcd state=directory'
# ansible node -m file -a 'path=/etc/etcd state=directory'
C.etcdを配置する.confプロファイルを他のノードに配布
# export ETCD_NAME=etcd1
# export INTERNAL_IP=192.168.100.102
# cat < etcd.conf
name: '${ETCD_NAME}'
data-dir: "/var/lib/etcd/"
listen-peer-urls: https://${INTERNAL_IP}:2380
listen-client-urls: https://${INTERNAL_IP}:2379,https://127.0.0.1:2379
initial-advertise-peer-urls: https://${INTERNAL_IP}:2380
advertise-client-urls: https://${INTERNAL_IP}:2379
initial-cluster: "etcd1=https://192.168.100.102:2380,etcd2=https://192.168.100.103:2380,etcd3=https://192.168.100.104:2380"
initial-cluster-token: 'etcd-cluster'
# ('new' or 'existing').
initial-cluster-state: 'new'
client-transport-security:
cert-file: /etc/kubernetes/ssl/etcd.pem
key-file: /etc/kubernetes/ssl/etcd-key.pem
trusted-ca-file: /etc/kubernetes/ssl/ca.pem
peer-transport-security:
cert-file: /etc/kubernetes/ssl/etcd.pem
key-file: /etc/kubernetes/ssl/etcd-key.pem
trusted-ca-file: /etc/kubernetes/ssl/ca.pem
EOF
# mv etcd.conf /etc/etcd/
## etcd IP ,
# ansible 192.168.100.103 -m copy -a 'src=etcd.conf dest=/etc/etcd/etcd.conf'
# ansible 192.168.100.104 -m copy -a 'src=etcd.conf dest=/etc/etcd/etcd.conf'
D.etcdクラスタの起動
# systemctl start etcd
# systemctl status etcd
# systemctl enable etcd
# ansible node -a 'systemctl start etcd'
# ansible node -a 'systemctl status etcd'
# ansible node -a 'systemctl enable etcd'
注意:最初のetcdノードは、他のノードの生存状態が検出されなかったため、起動に失敗しました.
E.クラスタメンバーの表示
# etcdctl --endpoints=https://192.168.100.102:2379 member list
32293bbc65784dda: name=etcd1 peerURLs=https://192.168.100.102:2380 clientURLs=https://192.168.100.102:2379 isLeader=true
703725a0e421bc44: name=etcd2 peerURLs=https://192.168.100.103:2380 clientURLs=https://192.168.100.103:2379 isLeader=false
78ac8de330c5272a: name=etcd3 peerURLs=https://192.168.200.104:2380 clientURLs=https://192.168.100.104:2379 isLeader=false
F.クラスタの健康状態の表示
# etcdctl --endpoints=https://192.168.100.102:2379 cluster-health
member 32293bbc65784dda is healthy: got healthy result from https://192.168.100.102:2379
member 703725a0e421bc44 is healthy: got healthy result from https://192.168.100.103:2379
member 78ac8de330c5272a is healthy: got healthy result from https://192.168.100.104:2379
cluster is healthy
2.flanneldの構成と有効化
A.起動項目を構成し、他のノードに配布する
# vim /usr/lib/systemd/system/flanneld.service
[Unit]
Description=Flanneld overlay address etcd agent
After=network.target
After=network-online.target
Wants=network-online.target
After=etcd.service
Before=docker.service
[Service]
Type=notify
EnvironmentFile=/etc/sysconfig/flanneld
EnvironmentFile=-/etc/sysconfig/docker-network
ExecStart=/usr/bin/flanneld-start $FLANNEL_OPTIONS
ExecStartPost=/usr/libexec/flannel/mk-docker-opts.sh -k DOCKER_NETWORK_OPTIONS -d /run/flannel/docker
Restart=on-failure
[Install]
WantedBy=multi-user.target
RequiredBy=docker.service
# ansible node -m copy -a 'src=/usr/lib/systemd/system/flanneld.service dest=/usr/lib/systemd/system/'
# cat < /usr/bin/flanneld-start
#!/bin/sh
exec /usr/bin/flanneld \
-etcd-endpoints=${FLANNEL_ETCD_ENDPOINTS:-${FLANNEL_ETCD}} \
-etcd-prefix=${FLANNEL_ETCD_PREFIX:-${FLANNEL_ETCD_KEY}} \
"$@"
EOF
# chmod 755 /usr/bin/flanneld-start
# ansible node -m copy -a 'src=/usr/bin/flanneld-start dest=/usr/bin/ mode=755'
B.flannelプロファイルを構成し、他のノードに配布する
# cat < /etc/sysconfig/flanneld
FLANNEL_ETCD_ENDPOINTS="https://192.168.100.102:2379,https://192.168.100.103:2379,https://192.168.100.104:2379"
FLANNEL_ETCD_PREFIX="/kube/network"
FLANNEL_OPTIONS="-etcd-cafile=/etc/kubernetes/ssl/ca.pem -etcd-certfile=/etc/kubernetes/ssl/etcd.pem -etcd-keyfile=/etc/kubernetes/ssl/etcd-key.pem"
EOF
# ansible node -m copy -a 'src=/etc/sysconfig/flanneld dest=/etc/sysconfig/'
C.etcdストレージを使用してflannelのディレクトリを作成し、ネットワーク構成を追加する
# etcdctl --endpoints=https://192.168.100.102:2379 mkdir /kube/network
# etcdctl --endpoints=https://192.168.100.102:2379 set /kube/network/config '{ "Network": "10.254.0.0/16" }'
{ "Network": "10.254.0.0/16" }
D.flanneldを起動する
# systemctl start flanneld
# systemctl status flanneld
# systemctl enable flanneld
# ansible node -a 'systemctl start flanneld'
# ansible node -a 'systemctl status flanneld'
# ansible node -a 'systemctl enable flanneld'
E.各ノードセグメントの表示
# cat /var/run/flannel/subnet.env
FLANNEL_NETWORK=10.254.0.0/16
FLANNEL_SUBNET=10.254.80.1/24
FLANNEL_MTU=1472
FLANNEL_IPMASQ=false
# ansible node -a "cat /var/run/flannel/subnet.env"
192.168.100.104 | SUCCESS | rc=0 >>
FLANNEL_NETWORK=10.254.0.0/16
FLANNEL_SUBNET=10.254.95.1/24
FLANNEL_MTU=1472
FLANNEL_IPMASQ=false
192.168.100.103 | SUCCESS | rc=0 >>
FLANNEL_NETWORK=10.254.0.0/16
FLANNEL_SUBNET=10.254.59.1/24
FLANNEL_MTU=1472
FLANNEL_IPMASQ=false
F.dockerセグメントがflannelに割り当てられたセグメントを変更する
# export FLANNEL_SUBNET=10.254.80.1/24
# cat < daemon.json
{
"bip" : "$FLANNEL_SUBNET"
}
EOF
# mkdir -p /etc/docker/ && mv daemon.json /etc/docker/
## ,
# ansible node -m file -a 'path=/etc/docker/ state=directory'
# ansible 192.168.100.103 -m copy -a 'src=daemon.json dest=/etc/docker/daemon.json'
# ansible 192.168.100.104 -m copy -a 'src=daemon.json dest=/etc/docker/daemon.json'
# systemctl daemon-reload
# systemctl restart docker
# ansible node -a "systemctl daemon-reload"
# ansible node -a "systemctl restart docker"
G.該当するセグメントが割り当てられているかどうかを確認する
# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.100.2 0.0.0.0 UG 100 0 0 ens33
10.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 flannel0
10.254.80.0 0.0.0.0 255.255.255.0 U 0 0 0 docker0
192.168.100.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
# ansible node -a 'route -n'
192.168.100.103 | SUCCESS | rc=0 >>
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.100.2 0.0.0.0 UG 100 0 0 ens33
10.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 flannel0
10.254.59.0 0.0.0.0 255.255.255.0 U 0 0 0 docker0
192.168.100.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
192.168.100.104 | SUCCESS | rc=0 >>
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.100.2 0.0.0.0 UG 100 0 0 ens33
10.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 flannel0
10.254.95.0 0.0.0.0 255.255.255.0 U 0 0 0 docker0
192.168.100.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
H.etcdctlコマンドを使用してflannelに関する情報を表示する
# etcdctl --endpoints=https://192.168.100.102:2379 ls /kube/network/subnets
/kube/network/subnets/10.254.80.0-24
/kube/network/subnets/10.254.59.0-24
/kube/network/subnets/10.254.95.0-24
# etcdctl --endpoints=https://192.168.100.102:2379 -o extended get /kube/network/subnets/10.254.80.0-24
Key: /kube/network/subnets/10.254.80.0-24
Created-Index: 10
Modified-Index: 10
TTL: 85486
Index: 12
{"PublicIP":"192.168.100.102"}
# etcdctl --endpoints=https://192.168.100.102:2379 -o extended get /kube/network/subnets/10.254.59.0-24
Key: /kube/network/subnets/10.254.59.0-24
Created-Index: 11
Modified-Index: 11
TTL: 85449
Index: 12
{"PublicIP":"192.168.100.103"}
# etcdctl --endpoints=https://192.168.100.102:2379 -o extended get /kube/network/subnets/10.254.95.0-24
Key: /kube/network/subnets/10.254.95.0-24
Created-Index: 12
Modified-Index: 12
TTL: 85399
Index: 12
{"PublicIP":"192.168.100.104"}
I.ネットワークが正常かどうかをテストする
# ping -c 4 10.254.59.1
# ping -c 4 10.254.95.1
3.Kubernetes Masterノードの構成と有効化
Kubernetes Masterノードに含まれるコンポーネント:
kube-apiserver
kube-controller-manager
kube-scheduler
A.configファイルを構成し、すべてのノードに配布する
# grep ^[A-Z] /etc/kubernetes/config
KUBE_LOGTOSTDERR="--logtostderr=true"
KUBE_LOG_LEVEL="--v=0"
KUBE_ALLOW_PRIV="--allow-privileged=true"
KUBE_MASTER="--master=http://192.168.100.102:8080"
# ansible node -m copy -a 'src=/etc/kubernetes/config dest=/etc/kubernetes/'
B.kube-apiserver起動項目の構成
# vim /usr/lib/systemd/system/kube-apiserver.service
[Unit]
Description=Kubernetes API Server
Documentation=https://github.com/kubernetes/kubernetes
After=network.target
After=etcd.service
[Service]
EnvironmentFile=-/etc/kubernetes/config
EnvironmentFile=-/etc/kubernetes/apiserver
ExecStart=/usr/bin/kube-apiserver \
$KUBE_LOGTOSTDERR \
$KUBE_LOG_LEVEL \
$KUBE_ETCD_SERVERS \
$KUBE_API_ADDRESS \
$KUBE_API_PORT \
$KUBELET_PORT \
$KUBE_ALLOW_PRIV \
$KUBE_SERVICE_ADDRESSES \
$KUBE_ADMISSION_CONTROL \
$KUBE_API_ARGS
Restart=on-failure
Type=notify
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
C.apiserverプロファイルの構成
# grep ^[A-Z] /etc/kubernetes/apiserver
KUBE_API_ADDRESS="--advertise-address=192.168.100.102 --bind-address=192.168.100.102 --insecure-bind-address=192.168.100.102"
KUBE_ETCD_SERVERS="--etcd-servers=https://192.168.100.102:2379,192.168.100.103:2379,192.168.100.104:2379"
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"
KUBE_ADMISSION_CONTROL="--admission-control=Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,PersistentVolumeLabel,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,ResourceQuota"
KUBE_API_ARGS="--authorization-mode=RBAC,Node --kubelet-https=true --service-node-port-range=30000-42767 --enable-bootstrap-token-auth --token-auth-file=/etc/kubernetes/token.csv --tls-cert-file=/etc/kubernetes/ssl/kubernetes.pem --tls-private-key-file=/etc/kubernetes/ssl/kubernetes-key.pem --client-ca-file=/etc/kubernetes/ssl/ca.pem --service-account-key-file=/etc/kubernetes/ssl/ca-key.pem --etcd-cafile=/etc/kubernetes/ssl/ca.pem --etcd-certfile=/etc/kubernetes/ssl/etcd.pem --etcd-keyfile=/etc/kubernetes/ssl/etcd-key.pem --enable-swagger-ui=true --event-ttl=1h --basic-auth-file=/etc/kubernetes/basic_auth_file"
D.アクセスユーザの設定
# echo admin,admin,1 > /etc/kubernetes/basic_auth_file
フォーマット:ユーザー名、パスワード、UID
E.kube-apiserverの起動
# systemctl start kube-apiserver
# systemctl status kube-apiserver
# systemctl enable kube-apiserver
F.adminユーザをclusterrole:cluster-adminにバインドして検証する
# kubectl get clusterrole/cluster-admin -o yaml
# kubectl create clusterrolebinding login-on-dashboard-with-cluster-admin --clusterrole=cluster-admin --user=admin
clusterrolebinding "login-on-dashboard-with-cluster-admin" created
# kubectl get clusterrolebinding/login-on-dashboard-with-cluster-admin -o yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
creationTimestamp: 2017-10-31T10:35:06Z
name: login-on-dashboard-with-cluster-admin
resourceVersion: "116"
selfLink: /apis/rbac.authorization.k8s.io/v1/clusterrolebindings/login-on-dashboard-with-cluster-admin
uid: 292ae19a-be27-11e7-853b-000c297aff5d
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: User
name: admin
G.kube-controller-manager起動項目の構成
# vim /usr/lib/systemd/system/kube-controller-manager.service
[Unit]
Description=Kubernetes Controller Manager
Documentation=
[Service]
EnvironmentFile=-/etc/kubernetes/config
EnvironmentFile=-/etc/kubernetes/controller-manager
ExecStart=/usr/bin/kube-controller-manager \
$KUBE_LOGTOSTDERR \
$KUBE_LOG_LEVEL \
$KUBE_MASTER \
$KUBE_CONTROLLER_MANAGER_ARGS
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
H.kube-controller-managerプロファイルの構成
# grep ^[A-Z] /etc/kubernetes/controller-manager
KUBE_CONTROLLER_MANAGER_ARGS="--address=127.0.0.1 --service-cluster-ip-range=10.254.0.0/16 --cluster-name=kubernetes --cluster-signing-cert-file=/etc/kubernetes/ssl/ca.pem --cluster-signing-key-file=/etc/kubernetes/ssl/ca-key.pem --service-account-private-key-file=/etc/kubernetes/ssl/ca-key.pem --root-ca-file=/etc/kubernetes/ssl/ca.pem"
I.kube-controller-managerを起動する
# systemctl start kube-controller-manager
# systemctl status kube-controller-manager
J.kube-scheduler起動項目の構成
# vim /usr/lib/systemd/system/kube-scheduler.service
[Unit]
Description=Kubernetes Scheduler Plugin
Documentation=
[Service]
EnvironmentFile=-/etc/kubernetes/config
EnvironmentFile=-/etc/kubernetes/scheduler
ExecStart=/usr/bin/kube-scheduler \
$KUBE_LOGTOSTDERR \
$KUBE_LOG_LEVEL \
$KUBE_MASTER \
$KUBE_SCHEDULER_ARGS
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
K.kube-schedulerプロファイルの構成
# grep ^[A-Z] /etc/kubernetes/scheduler
KUBE_SCHEDULER_ARGS="--address=127.0.0.1"
L.kube-schedulerを起動する
# systemctl start kube-scheduler
# systemctl status kube-scheduler
M.Masterノードの検証
# kubectl get cs
# kubectl get componentstatuses
NAME STATUS MESSAGE ERROR
scheduler Healthy ok
controller-manager Healthy ok
etcd-0 Healthy {"health": "true"}
4.Kubernetesノードの構成と有効化
Kubernetesノードには、次の項目があります.
kubelet
kube-proxy
A.クbeletに権限を与えてクbeletデータディレクトリを新規作成する
kubelet起動時にkube-apiserverにTLS bootstrappingリクエストを送信するには、bootstrap tokenファイルのkubelet-bootstrapユーザーにsystem:node-bootstrapper clusterロール(role)を付与してから、kubeletが認証リクエスト(certificate signing requests)を作成する権限を持つ必要があります.
Master:
# kubectl create clusterrolebinding kubelet-bootstrap \
--clusterrole=system:node-bootstrapper \
--user=kubelet-bootstrap
clusterrolebinding "kubelet-bootstrap" created
# mkdir -p /var/lib/kubelet
# ansible node -m file -a 'path=/var/lib/kubelet state=directory'
B.クbelet起動項目を構成し、nodeノードに配布する
# vim /usr/lib/systemd/system/kubelet.service
[Unit]
Description=Kubernetes Kubelet Server
Documentation=https://github.com/kubernetes/kubernetes
After=docker.service
Requires=docker.service
[Service]
WorkingDirectory=/var/lib/kubelet
EnvironmentFile=-/etc/kubernetes/config
EnvironmentFile=-/etc/kubernetes/kubelet
ExecStart=/usr/bin/kubelet \
$KUBE_LOGTOSTDERR \
$KUBE_LOG_LEVEL \
$KUBELET_ADDRESS \
$KUBELET_PORT \
$KUBELET_HOSTNAME \
$KUBE_ALLOW_PRIV \
$KUBELET_POD_INFRA_CONTAINER \
$KUBELET_ARGS
Restart=on-failure
[Install]
WantedBy=multi-user.target
## Node
# ansible node -m copy -a 'src=/usr/lib/systemd/system/kubelet.service dest=/usr/lib/systemd/system/'
C.クbeletプロファイルの設定
# export KUBELET_ADDRESS=192.168.100.102
# export KUBELET_HOSTNAME=Master
# cat < kubelet
KUBELET_ADDRESS="--address=$KUBELET_ADDRESS"
KUBELET_PORT="--port=10250"
KUBELET_HOSTNAME="--hostname-override=$KUBELET_HOSTNAME"
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=hub.c.163.com/k8s163/pause-amd64:3.0"
KUBELET_ARGS="--cluster-dns=10.254.0.2 --experimental-bootstrap-kubeconfig=/etc/kubernetes/bootstrap.kubeconfig --kubeconfig=/etc/kubernetes/kubelet.kubeconfig --fail-swap-on=false --cert-dir=/etc/kubernetes/ssl --cluster-domain=cluster.local. --serialize-image-pulls=false"
EOF
# mv kubelet /etc/kubernetes/
## kubelet IP hostname,
# ansible 192.168.100.103 -m copy -a 'src=kubelet dest=/etc/kubernetes/'
# ansible 192.168.100.104 -m copy -a 'src=kubelet dest=/etc/kubernetes/'
D.クbeletを起動する
# systemctl start kubelet
# systemctl status kubelet
# ansible node -a 'systemctl start kubelet'
# ansible node -a 'systemctl status kubelet'
E.ノードをKubernetesクラスタに追加
kubeletは、最初の起動時にkube-apiserverに証明書署名要求を送信し、クラスタにノードを追加するにはMaster認証が必要です.
# kubectl get nodes
No resources found.
# kubectl get csr ### CSR
NAME AGE REQUESTOR CONDITION
node-csr-ZU39iUu-E9FuadeTq58 9s kubelet-bootstrap Pending
node-csr-sJXwbG8c9UUGS8iTrV8 15s kubelet-bootstrap Pending
node-csr-zpol8cIJZfrcU8fd7l4 15s kubelet-bootstrap Pending
# kubectl certificate approve node-csr-ZU39iphJAYDQfsLssAwMViUu-E9Fua2pKhELMdeTq58 ### CSR [ ]
certificatesigningrequest "node-csr-ZU39iphJAYDQfsLssAwMViUu-E9Fua2pKhELMdeTq58" approved
# kubectl get csr
NAME AGE REQUESTOR CONDITION
node-csr-ZU39iUu-E9FuadeTq58 50s kubelet-bootstrap Approved,Issued
node-csr-sJXwbG8c9UUGS8iTrV8 1m kubelet-bootstrap Approved,Issued
node-csr-zpol8cIJZfrcU8fd7l4 1m kubelet-bootstrap Approved,Issued
# kubectl get nodes ## nodes
NAME STATUS AGE VERSION
master Ready 1m v1.8.2
node1 Ready 2m v1.8.2
node2 Ready 2m v1.8.2
注意:CSR認証後、ノード側で自動的にクbeletクbeconfigプロファイルと公開鍵が生成されます.
# ls /etc/kubernetes/kubelet.kubeconfig
/etc/kubernetes/kubelet.kubeconfig
# ls /etc/kubernetes/ssl/kubelet*
/etc/kubernetes/ssl/kubelet-client.crt /etc/kubernetes/ssl/kubelet-client.key /etc/kubernetes/ssl/kubelet.crt /etc/kubernetes/ssl/kubelet.key
F.kube-proxy起動項目を構成し、他のnodeノードに配布する
# vim /usr/lib/systemd/system/kube-proxy.service
[Unit]
Description=Kubernetes Kube-Proxy Server
Documentation=https://github.com/kubernetes/kubernetes
After=network.target
[Service]
EnvironmentFile=-/etc/kubernetes/config
EnvironmentFile=-/etc/kubernetes/proxy
ExecStart=/usr/bin/kube-proxy \
$KUBE_LOGTOSTDERR \
$KUBE_LOG_LEVEL \
$KUBE_MASTER \
$KUBE_PROXY_ARGS
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
## Node
# ansible node -m copy -a 'src=/usr/lib/systemd/system/kube-proxy.service dest=/usr/lib/systemd/system/'
G.カーネルパラメータの調整
# grep -v ^# /etc/sysctl.conf ### kube-proxy
net.ipv4.ip_forward=1
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
# sysctl -p ###
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
# ansible node -m copy -a 'src=/etc/sysctl.conf dest=/etc/'
# ansible node -a 'sysctl -p'
192.168.100.104 | SUCCESS | rc=0 >>
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
192.168.100.103 | SUCCESS | rc=0 >>
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
説明:このパラメータを追加したのはkube-proxyがiptablesを使用してデータ転送を行うためで、Linuxシステムはデフォルトでパケット転送を禁止しています.ここではnodeportを使用できないため発見しました.
H.kube-proxyプロファイルを構成し、他のnodeノードに配布する
# export KUBE_PROXY=192.168.100.102
# cat < proxy
KUBE_PROXY_ARGS="--bind-address=$KUBE_PROXY --hostname-override=$KUBE_PROXY --cluster-cidr=10.254.0.0/16 --proxy-mode=iptables --kubeconfig=/etc/kubernetes/kube-proxy.kubeconfig"
EOF
# mv proxy /etc/kubernetes/proxy
## kube-proxy IP,
# ansible 192.168.100.103 -m copy -a 'src=proxy dest=/etc/kubernetes/'
# ansible 192.168.100.104 -m copy -a 'src=proxy dest=/etc/kubernetes/'
I.kube-proxyを起動する
# systemctl start kube-proxy
# systemctl status kube-proxy
# ansible node -a 'systemctl start kube-proxy'
# ansible node -a 'systemctl status kube-proxy'
J.ノード関連情報の表示
# kubectl get nodes -o wide ### ( : Unknown )
NAME STATUS ROLES AGE VERSION EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
master Ready 3m v1.8.2 CentOS Linux 7 (Core) 3.10.0-693.2.2.el7.x86_64 docker://Unknown
node1 Ready 3m v1.8.2 CentOS Linux 7 (Core) 3.10.0-693.2.2.el7.x86_64 docker://Unknown
node2 Ready 3m v1.8.2 CentOS Linux 7 (Core) 3.10.0-693.2.2.el7.x86_64 docker://Unknown
# kubectl get node --show-labels=true
# kubectl get nodes --show-labels ###
NAME STATUS ROLES AGE VERSION LABELS
master Ready 4m v1.8.2 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=master
node1 Ready 5m v1.8.2 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=node1
node2 Ready 5m v1.8.2 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=node2
# kubectl version --short ### kubectl
Client Version: v1.8.2
Server Version: v1.8.2
# curl ###
ok
# kubectl cluster-info ###
Kubernetes master is running at https://192.168.100.102:6443
# kubectl get ns ###
# kubectl get namespace
NAME STATUS AGE
default Active 29m
kube-public Active 29m
kube-system Active 29m
# kubectl get services ### service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.254.0.1 443/TCP 36m
# kubectl get services --all-namespaces ### service
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default kubernetes ClusterIP 10.254.0.1 443/TCP 37m
# kubectl get ep ### endpoints
# kubectl get endpoints
NAME ENDPOINTS AGE
kubernetes 192.168.100.102:6443 38m
# kubectl get sa ### service account
# kubectl get serviceaccount
NAME SECRETS AGE
default 1 38m
説明:他のコマンドはkubectl--helpを使用して表示できます.一部の長いコマンドは、kubectl get namespaceがkubectl get nsと略記できるなど、kubectlコマンドテーブルの参照は次のとおりです.
http://docs.kubernetes.org.cn/683.html