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 各节点是否互联
3、 check 防火墙是否关闭
firewall的底层是使用iptables进行数据过滤,建立在iptables之上,这可能会与 Docker 产生冲突。比如,当 firewalld 启动或者重启的时候,将会从 iptables 中移除 DOCKER 的规则链,从而影响了 Docker 的正常工作
systemctl status firewalld
systemctl stop firewalld.service
systemctl disable firewalld.service
4、 禁掉所有的swap分区
修改/etc/fstab文件,注释掉 SWAP 的自动挂载,防止重启后swap启用
Kubernetes 1.8开始要求关闭系统的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 模式。否则容器不能访问宿主机文件系统。
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
6、 开启桥接网络支持
只针对(RHEL/CentOS 7)系统
什么是ipv4转发:出于安全考虑,Linux系统默认是禁止数据包转发的。转发即当主机拥有多于一块的网卡时,其中一块收到数据包,根据数据包的目的ip地址将数据包发往本机另一块网卡,该网卡根据路由表继续发送数据包。这通常是路由器所要实现的功能。
kube-proxy的ipvs模式和calico(都涉及路由转发)都需要主机开启ipv4转发。
另外,不使用k8s,即使只使用docker的时候,以下两种情况也依赖ipv4转发:
<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的服务运行状态是异常的: code=exited, status=255 。(因为缺少kubelet.conf等,可以暂不处理,在完成Master节点的初始化后会生成配置文件)
四、server节点:初始化集群
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 参数重新启动 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 节点做了 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、查看当前集群状态
$ 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 节点搭建环境
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 集群节点状态
$ 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