Kubernetesクラスタ導入2


1.etcdクラスタの構成と有効化
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