使用 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
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容