使用kubeadm來搭建k8s集羣
一、環境準備:
兩臺Centos7主機,166(master)167(node01),兩臺機都安裝docker,以下操作在兩臺機上都執行。
修改/etc/hosts文件內容
[zjin@master ~]$ cat /etc/hosts
10.3.4.166 master
10.3.4.167 node01
禁用防火牆
[zjin@master ~]$ sudo systemctl stop firewalld
[zjin@master ~]$ sudo systemctl disable firewalld
關閉selinux
cat /etc/selinux/config
SELINUX=disabled
創建/etc/sysctl.d/k8s.conf文件
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
再執行如下命令:
[zjin@master ~]$ sudo modprobe br_netfilter
[zjin@master ~]$ sudo sysctl -p /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
二、拉取鏡像:
在master上:
docker pull akipa11/kube-apiserver-amd64:v1.10.0
docker pull akipa11/kube-scheduler-amd64:v1.10.0
docker pull akipa11/kube-controller-manager-amd64:v1.10.0
docker pull akipa11/kube-proxy-amd64:v1.10.0
docker pull akipa11/k8s-dns-kube-dns-amd64:1.14.8
docker pull akipa11/k8s-dns-dnsmasq-nanny-amd64:1.14.8
docker pull akipa11/k8s-dns-sidecar-amd64:1.14.8
docker pull akipa11/etcd-amd64:3.1.12
docker pull akipa11/flannel:v0.10.0-amd64
docker pull akipa11/pause-amd64:3.1
docker tag akipa11/kube-apiserver-amd64:v1.10.0 k8s.gcr.io/kube-apiserver-amd64:v1.10.0
docker tag akipa11/kube-scheduler-amd64:v1.10.0 k8s.gcr.io/kube-scheduler-amd64:v1.10.0
docker tag akipa11/kube-controller-manager-amd64:v1.10.0 k8s.gcr.io/kube-controller-manager-amd64:v1.10.0
docker tag akipa11/kube-proxy-amd64:v1.10.0 k8s.gcr.io/kube-proxy-amd64:v1.10.0
docker tag akipa11/k8s-dns-kube-dns-amd64:1.14.8 k8s.gcr.io/k8s-dns-kube-dns-amd64:1.14.8
docker tag akipa11/k8s-dns-dnsmasq-nanny-amd64:1.14.8 k8s.gcr.io/k8s-dns-dnsmasq-nanny-amd64:1.14.8
docker tag akipa11/k8s-dns-sidecar-amd64:1.14.8 k8s.gcr.io/k8s-dns-sidecar-amd64:1.14.8
docker tag akipa11/etcd-amd64:3.1.12 k8s.gcr.io/etcd-amd64:3.1.12
docker tag akipa11/flannel:v0.10.0-amd64 quay.io/coreos/flannel:v0.10.0-amd64
docker tag akipa11/pause-amd64:3.1 k8s.gcr.io/pause-amd64:3.1
node01上:
docker pull akipa11/kube-proxy-amd64:v1.10.0
docker pull akipa11/flannel:v0.10.0-amd64
docker pull akipa11/pause-amd64:3.1
docker pull akipa11/kubernetes-dashboard-amd64:v1.8.3
docker pull akipa11/heapster-influxdb-amd64:v1.3.3
docker pull akipa11/heapster-grafana-amd64:v4.4.3
docker pull akipa11/heapster-amd64:v1.4.2
docker pull akipa11/k8s-dns-kube-dns-amd64:1.14.8
docker pull akipa11/k8s-dns-dnsmasq-nanny-amd64:1.14.8
docker pull akipa11/k8s-dns-sidecar-amd64:1.14.8
docker tag akipa11/flannel:v0.10.0-amd64 quay.io/coreos/flannel:v0.10.0-amd64
docker tag akipa11/pause-amd64:3.1 k8s.gcr.io/pause-amd64:3.1
docker tag akipa11/kube-proxy-amd64:v1.10.0 k8s.gcr.io/kube-proxy-amd64:v1.10.0
docker tag akipa11/k8s-dns-kube-dns-amd64:1.14.8 k8s.gcr.io/k8s-dns-kube-dns-amd64:1.14.8
docker tag akipa11/k8s-dns-dnsmasq-nanny-amd64:1.14.8 k8s.gcr.io/k8s-dns-dnsmasq-nanny-amd64:1.14.8
docker tag akipa11/k8s-dns-sidecar-amd64:1.14.8 k8s.gcr.io/k8s-dns-sidecar-amd64:1.14.8
docker tag akipa11/kubernetes-dashboard-amd64:v1.8.3 k8s.gcr.io/kubernetes-dashboard-amd64:v1.8.3
docker tag akipa11/heapster-influxdb-amd64:v1.3.3 k8s.gcr.io/heapster-influxdb-amd64:v1.3.3
docker tag akipa11/heapster-grafana-amd64:v4.4.3 k8s.gcr.io/heapster-grafana-amd64:v4.4.3
docker tag akipa11/heapster-amd64:v1.4.2 k8s.gcr.io/heapster-amd64:v1.4.2
三、安裝kubeadm、kubelet、kubectl
1、配置yum源:
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
2、安裝kubeadm、kubelet、kubectl
此處我們安裝的版本均爲1.10.0-0
$ yum makecache fast
$ yum install -y kubelet-1.10.0-0
$ yum install -y kubectl-1.10.0-0
$ yum install -y kubeadm-1.10.0-0
3、配置kubelet
-
修改cgroup-driver的參數
修改文件 kubelet 的配置文件
/etc/systemd/system/kubelet.service.d/10-kubeadm.conf
,將其中的KUBELET_CGROUP_ARGS
參數更改成cgroupfs
-
增加swap的配置參數
在
ExecStart
之前,增加以下內容:Environment="KUBELET_EXTRA_ARGS=--fail-swap-on=false"
最後再重新加載配置文件
systemctl daemon-reload
四、集羣安裝初始化
在master上執行以下命令:
[zjin@master ~]$ sudo kubeadm init \
> --kubernetes-version=v1.10.0 \
> --pod-network-cidr=10.244.0.0/16 \
> --apiserver-advertise-address=10.3.4.166 \
> --ignore-preflight-errors=Swap
集羣初始化的命令:kubeadm init,後面的參數是需要安裝的集羣版本,因爲我們這裏選擇flannel
作爲 Pod 的網絡插件,所以需要指定–pod-network-cidr=10.244.0.0/16
,然後是 apiserver 的通信地址,這裏就是我們 master 節點的 IP 地址,–ignore-preflight-errors=Swap
表示忽略 swap 的錯誤提示信息。
最後,我們可以看到集羣安裝成功的信息:
Your Kubernetes master has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
You can now join any number of machines by running the following on each node
as root:
kubeadm join 10.3.4.166:6443 --token b9ftqo.6a3igsfxq96b1dt6 --discovery-token-ca-cert-hash sha256:d4517be6c40e40e1bbc749b24b35c0a7f68c0f75c1380c32b24d1ccb42e0decc
輸入以下命令來配置使用kubectl訪問集羣:
[zjin@master ~]$ sudo mkdir -p $HOME/.kube
[zjin@master ~]$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[zjin@master ~]$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
配置好kubectl之後,我們就可以使用kubectl來查看集羣的相關信息了:
[zjin@master ~]$ kubectl get cs
NAME STATUS MESSAGE ERROR
controller-manager Healthy ok
scheduler Healthy ok
etcd-0 Healthy {"health": "true"}
[zjin@master ~]$ kubectl get csr
NAME AGE REQUESTOR CONDITION
csr-nff2l 6m system:node:master Approved,Issued
如果在集羣安裝過程中遇到了錯誤,可以使用下面的命令來進行重置:
$ kubeadm reset
$ ifconfig cni0 down && ip link delete cni0
$ ifconfig flannel.1 down && ip link delete flannel.1
$ rm -rf /var/lib/cni/
五、安裝pod network
此處我們安裝的是flannel網絡插件。
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
注意,此處文件內容的inage版本號要修改爲v0.10.0
[zjin@master ~]$ kubectl apply -f kube-flannel.yml
podsecuritypolicy.policy "psp.flannel.unprivileged" created
clusterrole.rbac.authorization.k8s.io "flannel" created
clusterrolebinding.rbac.authorization.k8s.io "flannel" created
serviceaccount "flannel" created
configmap "kube-flannel-cfg" created
daemonset.apps "kube-flannel-ds-amd64" created
daemonset.apps "kube-flannel-ds-arm64" created
daemonset.apps "kube-flannel-ds-arm" created
daemonset.apps "kube-flannel-ds-ppc64le" created
daemonset.apps "kube-flannel-ds-s390x" created
安裝完成後,我們可以使用kubectl get pods命令來查看集羣中各組件的運行狀態:
[zjin@master ~]$ kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system etcd-master 1/1 Running 0 40s
kube-system kube-apiserver-master 1/1 Running 0 40s
kube-system kube-controller-manager-master 1/1 Running 0 40s
kube-system kube-dns-86f4d74b45-4vbx5 3/3 Running 0 12m
kube-system kube-flannel-ds-amd64-wskq5 1/1 Running 0 52s
kube-system kube-proxy-7dk2l 1/1 Running 0 12m
kube-system kube-scheduler-master 1/1 Running 0 40s
可以看到,全部都是Running狀態。
六、添加節點
node01(167)上安裝版本號一致的docker、kubeadm、kubelet、kubectl,然後執行以下命令:
[zjin@node01 ~]$ sudo kubeadm join 10.3.4.166:6443 --token ebimj5.91xj7atpxbke4x yz --discovery-token-ca-cert-hash sha256:1eda2afcd5711343714ec2d2b6c6ea73ec06737 ee350b229d5b2eebfd82fb58a --ignore-preflight-errors=Swap
如果報錯:
[preflight] Some fatal errors occurred:
[ERROR CRI]: unable to check if the container runtime at "/var/run/docke rshim.sock" is running: fork/exec /bin/crictl -r /var/run/dockershim.sock info: no such file or directory
這個是cri-tools版本造成的錯誤,可以卸載掉cri-tools即可解決。
yum remove cri-tools
再執行加入節點的命令:
[zjin@node01 ~]$ sudo kubeadm join 10.3.4.166:6443 --token ebimj5.91xj7atpxbke4x yz --discovery-token-ca-cert-hash sha256:1eda2afcd5711343714ec2d2b6c6ea73ec06737 ee350b229d5b2eebfd82fb58a --ignore-preflight-errors=Swap
[preflight] Running pre-flight checks.
[WARNING SystemVerification]: docker version is greater than the most re cently validated version. Docker version: 18.03.0-ce. Max validated version: 17. 03
[WARNING FileExisting-crictl]: crictl not found in system path
Suggestion: go get github.com/kubernetes-incubator/cri-tools/cmd/crictl
[discovery] Trying to connect to API Server "10.3.4.166:6443"
[discovery] Created cluster-info discovery client, requesting info from "https:/ /10.3.4.166:6443"
[discovery] Requesting info from "https://10.3.4.166:6443" again to validate TLS against the pinned public key
[discovery] Cluster info signature and contents are valid and TLS certificate va lidates against pinned roots, will use API Server "10.3.4.166:6443"
[discovery] Successfully established connection with API Server "10.3.4.166:6443 "
This node has joined the cluster:
* Certificate signing request was sent to master and a response
was received.
* The Kubelet was informed of the new secure connection details.
Run 'kubectl get nodes' on the master to see this node join the cluster.
然後把 master 節點的~/.kube/config
文件拷貝到當前節點對應的位置即可使用 kubectl 命令行工具了。
[zjin@master ~]$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready master 47m v1.10.0
node01 Ready <none> 3m v1.10.0
可以看到,node01也已經加入集羣中了。