1、準備工作,三臺linux系統(tǒng)虛擬機。
master(192.168.159.160)、node1(192.168.159.161)、node2(192.168.159.162)。
版本:centos7.3,docker1.13,kubenetes1.11.0
2、所有節(jié)點安裝docker。
安裝docker1.13版本,添加阿里云centos7鏡像源即可(所有節(jié)點執(zhí)行)
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum install -y docker
systemctl enable docker && systemctl start docker
添加國內(nèi)鏡像加速
cat <<EOF > /etc/docker/daemon.json
{
"registry-mirrors": ["https://uf3mgws6.mirror.aliyuncs.com"]
}
EOF
如果需要安裝docker ce版本參考https://yq.aliyun.com/articles/110806添加鏡像源
注意:kubernetes1.11.0只兼容docker-ce-17.03以及以下版本,yum安裝docker-ce-17.03,需要先手動安裝 yum install https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-selinux-17.03.0.ce-1.el7.centos.noarch.rpm
3、關(guān)閉selinux,防火墻、虛擬內(nèi)存(所有節(jié)點執(zhí)行)
setenforce 0
修改/etc/selinux/config將SELINUX=enforcing改為SELINUX=disabled
systemctl stop firewalld
systemctl disable firewalld
swapoff -a # 關(guān)閉Swap,機器重啟后不生效
注釋/etc/fstab中swap的掛載永久關(guān)閉Swap
4、RHEL / CentOS 7上的一些用戶報告了由于iptables被繞過而導(dǎo)致流量路由不正確的問題。您應(yīng)該確保 net.bridge.bridge-nf-call-iptables在sysctl配置中設(shè)置為1(所有節(jié)點執(zhí)行)
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
5、添加kubernetes國內(nèi)源(所有節(jié)點執(zhí)行)
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
6、所有節(jié)點安裝kubelet、kubeadm和kubectl(所有節(jié)點安裝)
kubeadm:引導(dǎo)群集的命令。
kubelet:在群集中的所有計算機上運行的組件,并執(zhí)行諸如啟動pod和容器之類的操作。
kubectl:命令行util與您的群集通信。
yum install -y kubelet kubeadm kubectl
systemctl enable kubelet && systemctl start kubelet
7、配置主節(jié)點上的kubelet使用的cgroup驅(qū)動程序
docker info | grep -i cgroup
cat /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
如果Docker cgroup驅(qū)動程序和kubelet配置不匹配,請更改kubelet配置以匹配Docker cgroup驅(qū)動程序cgroup-driver=systemd|cgroupfs
kubenetes1.11.0版本和docker1.13(yum安裝)默認都是systemd,不需要做任何修改。
8、用kubeadm初始化Master
報錯: [ERROR FileContent--proc-sys-net-ipv4-ip_forward]: /proc/sys/net/ipv4/ip_forward contents are not set to 1
解決辦法:echo 1 > /proc/sys/net/ipv4/ip_forward
報錯:[WARNING Firewalld]: firewalld is active, please ensure ports [6443 10250] are open or your cluster may not function correctly
解決辦法:關(guān)閉防火墻,或者放開6443和10250端口
報錯:unable to get URL "https://dl.k8s.io/release/stable-1.11.txt": Get https://storage.useso.com/kubernetes-release/release/stable-1.11.txt: read tcp 192.168.159.148:60194->216.58.199.16:443: read: connection reset by peer
解決辦法:添加--kubernetes-version=1.11.0
報錯:[WARNING Hostname]: hostname "master" could not be reached
解決辦法:echo "127.0.0.1 master" >> /etc/hosts
報錯:[WARNING Swap]: running with swap on is not supported. Please disable swap
解決辦法:
# 關(guān)閉Swap,機器重啟后不生效swapoff -a
# 修改/etc/fstab永久關(guān)閉Swap
重置kubeadm安裝狀態(tài):kubeadm reset
kubeadm init --kubernetes-version=1.11.0 --apiserver-advertise-address=192.168.159.160 --pod-network-cidr=10.244.0.0/16
注意:執(zhí)行之前提前pull鏡像(可以腳本pull),并docker tag 更改鏡像名稱。(k8s.gcr.io/pause-amd64 需要改成k8s.gcr.io/pause,其他按照默認名稱即可,不知道鏡像名稱可以kubeadm init 會自動到google下載鏡像,等到失敗可以查看)
9、新建普通用戶
useradd k8s && echo "password" | passwd --stdin k8s
su - k8s
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
添加自動補全功能
echo "source < (kubectl completion bash)" >> /home/k8s/.bashrc
10、安裝pod網(wǎng)絡(luò)
mkdir -p /etc/cni/net.d/
docker pull quay.io/coreos/flannel:v0.10.0-amd64
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.10.0/Documentation/kube-flannel.yml (在master切換 普通用戶執(zhí)行)
11、添加節(jié)點node1和node2
分別在node1和node2節(jié)點執(zhí)行
kubeadm join 192.168.159.160:6443 --token 1t0syj.oih1kgks8llwfatu --discovery-token-ca-cert-hash sha256:80ae046b8b3952e40510b2a84256795eb00cfc3e4e11c6597ff9e40fb4c5d63e
注意:如果token和CA-hash之前執(zhí)行kubeadm init 成功信息沒有保存,可以執(zhí)行
kubeadm token create --print-join-command重新生成token,或者使用kubeadm token list 查看之前的token(無法查看ca-hash)
查看節(jié)點狀態(tài)kubectl get nodes (在master切換 普通用戶執(zhí)行)

節(jié)點狀態(tài)NotReady,是因為每個節(jié)點都需要啟動若干組件,這些組件都在pod中運行。
可以執(zhí)行kubectl get pod --all-namespaces 查看pod狀態(tài)

非Running狀態(tài)需要查看具體原因,使用kubectl describe pod <pod name>
[k8s@master ~]$ kubectl describe pod coredns-78fcdf6894-ccjs8 --namespace=kube-system

Warning FailedCreatePodSandBox 1h kubelet, master Failed create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox js8": NetworkPlugin cni failed to set up pod "coredns-78fcdf6894-ccjs8_kube-system" network: open /run/flannel/subnet.env: no such file or directory
此報錯因為此文件不存在,可以執(zhí)行
cat <<EOF> /run/flannel/subnet.env
FLANNEL_NETWORK=10.244.0.0/16
FLANNEL_SUBNET=10.244.1.0/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=true
EOF
[k8s@master ~]$ kubectl describe pod kube-proxy-9np7v --namespace=kube-system
Warning FailedCreatePodSandBox 1h (x18 over 1h) kubelet, node1 Failed create pod sandbox: rpc error: code = Unknown desc = failed pulling image "k8s.gcr.io/pause:3.1": Get https://k8s.gcr.io/v1/_ping: dial tcp 108.177.125.82:443: getsockopt: connection refused
此報錯是因為node1節(jié)點pull國外鏡像失敗,手動pull即可。
[root@node1 ~]# docker pull registry.cn-shenzhen.aliyuncs.com/cookcodeblog/pause:3.1
[root@node1 ~]# docker tag registry.cn-shenzhen.aliyuncs.com/cookcodeblog/pause:3.1 k8s.gcr.io/pause:3.1
[root@node1 ~]# docker rmi registry.cn-shenzhen.aliyuncs.com/cookcodeblog/pause:3.1
[root@node1 ~]# docker pull registry.cn-shenzhen.aliyuncs.com/cookcodeblog/kube-proxy-amd64:v1.11.0
[root@node2 ~]# docker tag registry.cn-shenzhen.aliyuncs.com/cookcodeblog/kube-proxy-amd64:v1.11.0 k8s.gcr.io/kube-proxy-amd64:v1.11.0
[root@node2 ~]# docker rmi registry.cn-shenzhen.aliyuncs.com/cookcodeblog/kube-proxy-amd64:v1.11.0
節(jié)點node2也執(zhí)行上面命令
[k8s@master ~]$ kubectl describe pod kube-proxy-fz4c4 --namespace=kube-system
Warning FailedCreatePodSandBox 15m (x26 over 1h) kubelet, node2 Failed create pod sandbox: rpc error: code = Unknown desc = failed pulling image "k8s.gcr.io/pause:3.1": Get https://k8s.gcr.io/v1/_ping: dial tcp 64.233.188.82:443: getsockopt: connection refused
上面kube-flannel-ds-**非運行狀態(tài)是因為node1和node2還沒有pull鏡像quay.io/coreos/flannel:v0.10.0-amd64,可以等docker自己pull或者手動pull
最終node1和node2節(jié)點如下:

master節(jié)點如下:

到此,Kubernetes Cluster創(chuàng)建成功。


