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>
大功告成...