使用 kubeadm 离线部署 kubernete v1.13.0

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
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容