Kubernetes配置

1.Master初始化(Master 需要配置)

# kubeadm reset

# kubeadm init --kubernetes-version=v1.9.3 --pod-network-cidr=10.244.0.0/16

Tip: 這裡的10.244.0.0/16與默認的配置文件網段一致, 如需调整請在後面的kube-flannel.yml文件做相應改變

如果一切沒問題會output一個token返回命令

# kubeadm join --token 288f34.481c8faa5636966f 172.17.2.153:6443 --discovery-token-ca-cert-hash sha256:8036fac3b76e1a0dd189edaa8f7d36f2b51429dd0c0cf7ea0d78e7972d611002

24小时後這個token會失效, 需要重新生成, 使用如下命令進行生成.

# kubeadm token create --print-join-command

# kubeadm join --token "Your token code" "Your master ip address":6443

如果在24小時内忘記了,可以用如下命令獲取.

# kubeadmin token list

Master Node初始化完成,使用kubeadm初始化的Kubernetes集群在Master節點上的核心组件:kube-apiserver, kube-scheduler, kube-controller-manager是以靜態Pod的形式運行的。

ls /etc/kubernetes/manifests/
etcd.yaml  kube-apiserver.yaml  kube-controller-manager.yaml  kube-scheduler.yaml

在/etc/kubernetes/manifests/目錄裡可以看到kube-apiserver, kube-scheduler, kube-controller-manager的定義文件。另外集群持久化儲存etcd也是以單點靜態Pod的形式運行的,對於etcd後邊我們會把它切换成etcd集群,這裡暫且不表。

查看一下kube-apiserver.yaml的内容:

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    component: kube-apiserver
    tier: control-plane
  name: kube-apiserver
  namespace: kube-system
spec:
  containers:
  - command:
    - kube-apiserver
    .......
    - --insecure-port=0

注意到kube-apiserver的選項--insecure-port=0,也就是說kubeadm 1.9.3初始化的集群,kube-apiserver沒有監聽默認的http 8080端口。 所以我们使用kubectl get nodes会报The connection to the server localhost:8080 was refused - did you specify the right host or port?

查看kube-apiserver的監聽端口可以看到只監聽了https的6443端口,

netstat -nltp | grep apiserver
tcp6       0      0 :::6443                 :::*                    LISTEN      9831/kube-apiserver

為了使用kubectl訪問apiserver,在~/.bash_profile中追加下面的環境變數:

export KUBECONFIG=/etc/kubernetes/admin.conf
source ~/.bash_profile

此時kubectl命令在master node上就好用了,查看一下當前機器中的Node:

kubectl get nodes
NAME      STATUS     AGE       VERSION
node0     NotReady   3m        v1.6.1

集群初始化如果遇到問题,可以使用下面的命令進行清理(重新init後一樣要重設網路組件):

kubeadm reset
ifconfig cni0 down
ip link delete cni0
ifconfig flannel.1 down
ip link delete flannel.1
rm -rf /var/lib/cni/

確認集群狀態:

$ kubectl get cs
NAME                 STATUS    MESSAGE              ERROR
scheduler            Healthy   ok
controller-manager   Healthy   ok
etcd-0               Healthy   {"health": "true"}

2.設置用戶環境變量(Master 需要配置)

如果你使用的是root
# echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
# source ~/.bash_profile

如果是非user用戶

# mkdir -p $HOME/.kube
# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# sudo chown $(id -u):$(id -g) $HOME/.kube/config

# 測試kubectl版本

# kubectl version

Client Version: version.Info{Major:"1", Minor:"9", GitVersion:"v1.9.0", GitCommit:"925c127ec6b946659ad0fd596fa959be43f0cc05", GitTreeState:"clean", BuildDate:"2017-12-15T21:07:38Z", GoVersion:"go1.9.2", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"9", GitVersion:"v1.9.0", GitCommit:"925c127ec6b946659ad0fd596fa959be43f0cc05", GitTreeState:"clean", BuildDate:"2017-12-15T20:55:30Z", GoVersion:"go1.9.2", Compiler:"gc", Platform:"linux/amd64"}

3.使用flannel組件進行k8s網路配置(Master 需要配置)

# wget https://raw.githubusercontent.com/coreos/flannel/v0.9.1/Documentation/kube-flannel.yml

Tip: 這裡的yml配置文件内的網段配置需與上面介绍的Master初始化的配置網段"--pod-network-cidr=10.244.0.0/16" 一致

# kubectl create -f kube-flannel.yml

創建完會新增兩個設備

6: flannel.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN
    link/ether 9e:a4:0e:29:5c:cf brd ff:ff:ff:ff:ff:ff
    inet 10.244.0.0/32 scope global flannel.1
       valid_lft forever preferred_lft forever
    inet6 fe80::9ca4:eff:fe29:5ccf/64 scope link
       valid_lft forever preferred_lft forever

7: cni0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP qlen 1000
    link/ether 0a:58:0a:f4:00:01 brd ff:ff:ff:ff:ff:ff
    inet 10.244.0.1/24 scope global cni0
       valid_lft forever preferred_lft forever
    inet6 fe80::c83d:76ff:fe49:6232/64 scope link
       valid_lft forever preferred_lft forever

4.查看所有pod詳细信息(Master 需要配置)

# kubectl get pod --all-namespaces -o wide

# kubectl describe pods

5.添加Node(Node 需要配置)

從Master初始化輸出中獲取

# kubeadm join --token 288f34.481c8faa5636966f 172.17.2.153:6443 --discovery-token-ca-cert-hash sha256:8036fac3b76e1e0dd189edaa8f7d36f1b51429dd0c0cf7ea0d78e7972d611002

如果在master delete node,該node要重新加入的話也需執行kubeadm reset

6.將Master加入Node schedual調度(Master 需要配置)

Tip: 默認Master不會加入Node調度, 這裡使用如下命令開啟這個限制.

$ kubectl taint nodes --all node-role.kubernetes.io/master-

如果我們有多個node需要手動去做調度, 從而不讓我們的pod進入該node調度列表, 可以使用如下命令:

禁用該node請度

# kubectl cordonkube-node-1

查看是否禁用

# kubectl get node kube-node-1

NAME          STATUS                     ROLES     AGE       VERSION
kube-node-1   Ready,SchedulingDisabled   node    11d       v1.9.0

解禁該node調度

# kubectl uncordonkube-node-1

查看是否解禁

# kubectl get nodes kube-node-1

NAME          STATUS  ROLES     AGE       VERSION
kube-node-1   Ready   node    11d       v1.9.0

7.測試K8s cluster(Master 需要配置)

我们利用k8s創建一个apache的網路實例, 鏡像為httpd, 並設置2個副本.

# kubectl run httpd-app --image=httpd --replicas=2

# kubectl get deployment

NAME        DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
httpd-app   2         2         2            2           2h

# kubectl get pods -o wide

NAME                         READY     STATUS    RESTARTS   AGE       IP            NODE
httpd-app-5fbccd7c6c-27nzv   1/1       Running   0          2h        10.244.0.13   kube-master
httpd-app-5fbccd7c6c-n9qs2   1/1       Running   0          2h        10.244.0.12   kube-master

8.測試網路實例(Master 需要配置)

# curl 10.244.0.13

<html><body><h1>It works!</h1></body></html>

# curl 10.244.0.12

<html><body><h1>It works!</h1></body></html>

大功告成...

results matching ""

    No results matching ""