ip | hostname | role |
---|---|---|
10.127.24.180 | k8s-node1 | k8s-node |
10.127.24.179 | k8s-master1 | k8s-master |
10.39.5.226 | k8s-node2 | k8s-node |
一疯特、準備工作
1救拉、 開啟 docker
check docker 版本及其 check cgroup driver
$ docker --version
Docker version 17.05.0-ce, build e1bfc47
$ systemctl enable docker && systemctl restart docker && systemctl status docker
docker is active
$ docker info | grep Cgroup
Cgroup Driver: cgroupfs
2、 check 各節(jié)點是否互聯(lián)
3、 check 防火墻是否關閉
firewall的底層是使用iptables進行數(shù)據(jù)過濾拌牲,建立在iptables之上殿雪,這可能會與 Docker 產生沖突宿饱。比如,當 firewalld 啟動或者重啟的時候芯急,將會從 iptables 中移除 DOCKER 的規(guī)則鏈失驶,從而影響了 Docker 的正常工作
systemctl status firewalld
systemctl stop firewalld.service
systemctl disable firewalld.service
4土居、 禁掉所有的swap分區(qū)
修改/etc/fstab文件,注釋掉 SWAP 的自動掛載,防止重啟后swap啟用
Kubernetes 1.8開始要求關閉系統(tǒng)的Swap擦耀。如果不關閉棉圈,默認配置下kubelet將無法啟動
free -m 檢查 swap 是否關閉
$ swapoff -a
$ vim /etc/fstab
#把這行注釋: /dev/mapper/centos-swap swap
$ free -m
Swap: 0 0 0
5、 關閉 SELinux
把 SELinux設為 permissive 模式眷蜓。否則容器不能訪問宿主機文件系統(tǒng)分瘾。
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
6、 開啟橋接網絡支持
只針對(RHEL/CentOS 7)系統(tǒng)
什么是ipv4轉發(fā):出于安全考慮吁系,Linux系統(tǒng)默認是禁止數(shù)據(jù)包轉發(fā)的德召。轉發(fā)即當主機擁有多于一塊的網卡時,其中一塊收到數(shù)據(jù)包汽纤,根據(jù)數(shù)據(jù)包的目的ip地址將數(shù)據(jù)包發(fā)往本機另一塊網卡上岗,該網卡根據(jù)路由表繼續(xù)發(fā)送數(shù)據(jù)包。這通常是路由器所要實現(xiàn)的功能蕴坪。
kube-proxy的ipvs模式和calico(都涉及路由轉發(fā))都需要主機開啟ipv4轉發(fā)肴掷。
另外呆瞻,不使用k8s,即使只使用docker的時候买窟,以下兩種情況也依賴ipv4轉發(fā):
<1>當同一主機上的兩個跨bridge(跨bridge相當于跨網段,跨網絡需要路由)的容器互訪
<2>從容器內訪問外部
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
sysctl -p /etc/sysctl.d/k8s.conf
二学赛、安裝 kubelet,kubeadm,kubectl, cni-plugins
使用 kubeadm 來進行搭建
kubeadm 不會幫忙下載 kubelet kubectl,所以要先安裝好
cni-plugins 里包含眾多插件,如果不安裝攻晒, 配置網絡時萧芙,kubelet 會報 NetworkPlugin cni 錯誤
鏈接: https://pan.baidu.com/s/1K5rA3Di_uVgE96pK3tst4Q 提取碼: hm6r
chmod +x /usr/bin/kubeadm
chmod +x /usr/bin/kubelet
chmod +x /usr/bin/kubectl
cd /opt/cni/bin
tar -xvf cni-plugins-amd64-v0.7.4.tgz
rm -f cni-plugins-amd64-v0.7.4.tgz
三破喻、運行kubelet
kubelet 啟動默認值為Cgroup Driver 是 cgroupfs。查看kubelet的配置文件,如果是默認的cgroupfs,不需要修改姨夹。否則需要修改。
$ cat <<EOF > /etc/systemd/system/kubelet.service
[Unit]
Description=kubelet: The Kubernetes Node Agent
Documentation=https://kubernetes.io/docs/
[Service]
ExecStart=/usr/bin/kubelet
Restart=always
StartLimitInterval=0
RestartSec=10
[Install]
WantedBy=multi-user.target
EOF
$ mkdir -p /etc/systemd/system/kubelet.service.d/
$ cat <<EOF > /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
[Service]
Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf"
Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml"
EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env
EnvironmentFile=-/etc/sysconfig/kubelet
ExecStart=
ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS
EOF
$ cat /var/lib/kubelet/kubeadm-flags.env
KUBELET_KUBEADM_ARGS=--cgroup-driver=cgroupfs --network-plugin=cni
$ cat /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS=
$ systemctl daemon-reload
$ systemctl enable kubelet && systemctl restart kubelet
$ systemctl status kubelet -l
此時kubelet的服務運行狀態(tài)是異常的: code=exited, status=255 蓬豁。(因為缺少kubelet.conf等,可以暫不處理笑跛,在完成Master節(jié)點的初始化后會生成配置文件)
四聊品、server節(jié)點:初始化集群
1飞蹂、 導入 server 所需鏡像
tar -xvf k8s-images.tar
docker load < k8s-images/kube-apiserver.tar
docker load < k8s-images/coredns.tar
docker load < k8s-images/etcd.tar
docker load < k8s-images/kube-scheduler.tar
docker load < k8s-images/kube-controller-manager.tar
docker load < k8s-images/kube-proxy.tar
docker load < k8s-images/pause.tar
查看鏡像是否齊全
$ docker images -a
REPOSITORY TAG IMAGE ID CREATED SIZE
k8s.gcr.io/kube-proxy v1.13.0 8fa56d18961f 34 hours ago 80.2MB
k8s.gcr.io/kube-scheduler v1.13.0 9508b7d8008d 34 hours ago 79.6MB
k8s.gcr.io/kube-apiserver v1.13.0 f1ff9b7e3d6e 34 hours ago 181MB
k8s.gcr.io/kube-controller-manager v1.13.0 d82530ead066 34 hours ago 146MB
k8s.gcr.io/coredns 1.2.6 f59dcacceff4 4 weeks ago 40MB
k8s.gcr.io/etcd 3.2.24 3cab8e1b9802 2 months ago 220MB
k8s.gcr.io/pause 3.1 da86e6ba6ca1 11 months ago 742kB
quay.io/coreos/flannel v0.10.0-amd64 f0fad859c909 10 months ago 44.6MB
2、啟動集群
使用 flannel 搭建 pod 網絡翻屈,必須添加 –pod-network-cidr 參數(shù)重新啟動 kubernete 集群
kubeadm init --kubernetes-version=v1.13.0 --apiserver-advertise-address=10.127.24.179 --pod-network-cidr=10.244.0.0/16
看到如下信息說明啟動成功
Your Kubernetes master has initialized successfully!
記錄最后一行陈哑,node 加入集群時使用
kubeadm join xxx --token xxxxxx --discovery-token-ca-cert-hash sha256:yyyyyy
3、配置 master
作為 root 用戶
cat <<EOF >> ~/.bash_profile
export KUBECONFIG=/etc/kubernetes/admin.conf
EOF
source ~/.bash_profile
如果要給其他用戶調用 kubectl 的權限
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
(可選)設置 master 參與工作負載
kubeadm 初始化的集群伸眶,將 master 節(jié)點做了 taint惊窖,默認情況下 Pod 不會被調度到 master 上。
使用下面的命令去掉master的taint厘贼,使master參與工作負載:
kubectl taint nodes --all node-role.kubernetes.io/master-
node "xxxx" untainted
改回命令界酒,設置 master 不參與工作負載
kubectl taint nodes k8s node-role.kubernetes.io/master=true:NoSchedule
4、配置 flannel 網絡
kubectl apply -f kube-flannel.yml
output:
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.extensions/kube-flannel-ds-amd64 created
daemonset.extensions/kube-flannel-ds-arm64 created
daemonset.extensions/kube-flannel-ds-arm created
daemonset.extensions/kube-flannel-ds-ppc64le created
daemonset.extensions/kube-flannel-ds-s390x created
5嘴秸、查看當前集群狀態(tài)
$ kubectl get componentstatus
NAME STATUS MESSAGE ERROR
controller-manager Healthy ok
scheduler Healthy ok
etcd-0 Healthy {"health": "true"}
$ kubectl get nodes
master : Ready
$ kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-86c58d9df4-j8t2t 1/1 Running 0 6m20s
coredns-86c58d9df4-wr9sk 1/1 Running 0 6m20s
etcd-k8s-master 1/1 Running 0 5m32s
kube-apiserver-k8s-master 1/1 Running 0 5m43s
kube-controller-manager-k8s-master 1/1 Running 0 5m21s
kube-flannel-ds-amd64-st4sv 1/1 Running 0 4m
kube-proxy-d7t4d 1/1 Running 0 6m20s
kube-scheduler-k8s-master 1/1 Running 0 5m39s
五毁欣、Node 加入集群
1、按上述步驟一岳掐、二凭疮、三在 node 節(jié)點搭建環(huán)境
2、導入鏡像
tar -xvf k8s-images.tar
docker load < k8s-images/pause.tar
docker load < k8s-images/kube-proxy.tar
docker load < k8s-images/flannel.tar
3串述、加入集群
kubeadm join xxxxx --token xxxxx --discovery-token-ca-cert-hash sha256:xxxxxx
output:
This node has joined the cluster!
六执解、Master:check 集群節(jié)點狀態(tài)
$ kubectl get nodes
output:
NAME STATUS ROLES AGE VERSION
k8s-master1 Ready master 40h v1.13.0
k8s-node1 Ready <none> 17h v1.13.0
k8s-node2 Ready <none> 14s v1.13.0