K8S的安装方式

最简单的方法是使用yum install kubernetes命令安装Kubernetes集群,但仍需修改各组件的启动参数,才能完成对Kubernetes集群的配置,整个过程比较复杂,也容易出错。但是对于新手来说是一个熟悉k8s的一个过程,可以适当借鉴学习。

Kubernetes从1.4版本开始引入了命令行工具kubeadm,致力于简化集群的安装过程,并解决Kubernetes集群的高可用问题。在Kubernetes 1.13版本中,kubeadm工具进入GA阶段,宣称已经为生产环境应用准备就绪。比较推荐使用这种方式,安装便捷并且容错率高

本节先讲解基于 yum install kubernetes命令安装

Master节点:192.168.1.132

Node节点:192.168.1.134

K8S基于yum的安装

安装前先关闭防火墙

1
systemctl stop firewalld

修改系统文件/etc/sysconfig/selinux,将SELINUX=enforcing修改成SELINUX=disabled,然后重启Linux。
或者执行以下命令

1
setenforce 0

编辑/etc/sysctl.conf添加以下内容

1
2
3
4
5
6
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward=1
vm.swappiness = 0
fs.inotify.maxuserwatches = 24576
vm.max_map_count=655360

然后执行命令 sysctl -p,如果报错,执行命令modprobe br_netfilter

安装Master节点

1、安装Docker

安装docker教程

2、Master节点安装etcd

1
yum install etcd -y

etcd用于K8S的数据存储,原生支持做集群,修改/etc/etcd/etcd.conf配置,指向Master节点

1
2
3
[root@localhost /]# vim /etc/etcd/etcd.conf
6 行:ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
22行:ETCD_ADVERTISE_CLIENT_URLS="http://192.168.1.132:2379"

启动etcd服务并且设置开机自启

1
2
[root@localhost /]# systemctl start etcd.service
[root@localhost /]# systemctl enable etcd.service

检查

1
2
3
4
5
6
7
8
[root@localhost /]# netstat -lntup|grep 2379
tcp6 0 0 :::2379 :::* LISTEN 117472/etcd


#检查健康状态
[root@localhost /]# etcdctl -C http://192.168.1.132:2379 cluster-health
member 8e9e05c52164694d is healthy: got healthy result from http://192.168.1.132:2379
cluster is healthy

测试

1
2
3
4
5
6
7
8
9
10
11
# 插入数据 键(目录)值(123456)
[root@localhost /]# etcdctl set /test/word 123456
123456
[root@localhost /]# etcdctl ls /
/test
[root@localhost /]# etcdctl ls /test
/test/word
[root@localhost /]# etcdctl get /test/word # 查看值
123456
[root@localhost /]#etcdctl rm /test/word # 删除键值对
[root@localhost /]#etcdctl rmdir /test # 删除目录

3、Master节点192.168.1.132安装K8S

以下命令根据需求二选一即可

1
2
3
4
5
#安装Master节点和Node节点的服务,适用于服务器数量不够时共用同一台服务器
yum install kubernetes -y

#安装Master节点需要的服务,适用于服务器数量充足分离Master和Node节点
yum install kubernetes-master.x86_64 -y

本人Master节点[192.168.1.132]也安装了Node节点服务,可以用于测试两个不同宿主机上Node节点通信。

kubelet默认把数据存放在/var/lib/kubelet下面,如果根目录下空间太小,可能会把磁盘撑爆。可以将数据挂载在充足空间的盘上

1
2
3
4
mkdir -p /home/kubelet
cp -r /var/lib/kubelet /home/
rm -rf /var/lib/kubelet
ln -sf /home/kubelet /var/lib/kubelet

4、修改apiserver配置文件

安装好了后进入/etc/kubernetes/配置目录修改相关配置

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@localhost /]# vim /etc/kubernetes/apiserver
#服务的监听地址
8 行: KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"
#服务监听的端口
11行:KUBE_API_PORT="--port=8080"
#通过10250端口控制kubelet
14行:KUBELET_PORT="--kubelet-port=10250"
#APIserver是通过那个地址和端口连接etcd数据
17行:KUBE_ETCD_SERVERS="--etcd-servers=http://192.168.1.132:2379"
#K8S创建service服务的网段配置
20行:KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"
#默认的管理控制插件---将后面的ServiceAccount去掉
23行:KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"

5、修改通用的配置文件config

1
2
3
[root@localhost kubernetes]# vim /etc/kubernetes/config
#通过那个地址端口找到API服务
22行:KUBE_MASTER="--master=[http://192.168.1.132:8080]

6、启动服务并设置开启自启

1
2
3
4
5
6
systemctl enable kube-apiserver.service
systemctl start kube-apiserver.service
systemctl enable kube-controller-manager.service
systemctl start kube-controller-manager.service
systemctl enable kube-scheduler.service
systemctl start kube-scheduler.service

7、测试集群是否正常

1
2
3
4
5
[root@localhost /]# kubectl get componentstatus
NAME STATUS MESSAGE ERROR
etcd-0 Healthy {"health":"true"}
controller-manager Healthy ok
scheduler Healthy ok

安装Node节点

1、Node节点192.168.1.134安装K8S

如果没有第二台服务器,Master节点和Node节点同一台服务器时跳过安装步骤

1
yum install kubernetes-node.x86_64 -y   (自动会安装docker)

值得一提的是,如果Master节点也安装了Node节点的服务,Master节点机器也需要修改以下的所有相关配置

2、修改kube-proxy服务配置文件

1
2
[root@localhost ~]# vim /etc/kubernetes/config
22行:KUBE_MASTER="--master=[http://192.168.1.132:8080]

3、修改kubelet服务配置文件

1
2
3
4
5
6
7
8
9
10
11
[root@localhost ~]# vim /etc/kubernetes/kubelet
# 监听的地址
5行:KUBELET_ADDRESS="--address=0.0.0.0"
#kubelet端口
8行:KUBELET_PORT="--port=10250"
# 给自己定义唯一的名字 不能冲突 IP地址或者主机名(各自节点改各自节点的IP)
11行:KUBELET_HOSTNAME="--hostname-override=192.168.1.134"
# Master节点的连接api的地址
14行:KUBELET_API_SERVER="--api-servers=[http://192.168.1.132:8080]
# 节点的DNS配置
KUBELET_ARGS="--cluster-dns=192.168.1.1 --cluster-domain=cluster.local"

如果不知道DNS配置,可以执行下列命令

1
2
3
4
5
[root@localhost kubernetes]# cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 192.168.1.1
nameserver 114.114.114.114
search localdomain

如果没有任何信息显示,vim /etc/resolv.conf并增加以下内容nameserver 114.114.114.114然后把该DNS增加到kubelet文件配置中

4、修改服务通用的配置文件config

1
2
3
[root@localhost kubernetes]# vim /etc/kubernetes/config
#通过那个地址端口找到API服务
22行:KUBE_MASTER="--master=[http://192.168.1.132:8080]

5、启动服务并设置开机自启

1
2
3
4
5
systemctl  start  kubelet.service 
systemctl enable kubelet.service

systemctl start kube-proxy.service
systemctl enable kube-proxy.service

6、在Master节点测试是否有节点加入集群

1
2
3
4
[root@localhost /]# kubectl get node
NAME STATUS AGE
192.168.1.132 Ready 8d
192.168.1.134 Ready 9d

安装flanneld网络通讯

由于K8S创建的Service、Pod服务均是生成的虚拟IP,两台Node节点之间的Pod通信需要通过第三方插件实现.Master节点和Node节点都需要安装和配置

1、安装flanneld

1
yum install flannel -y

2、修改flanneld配置文件

1
sed -i 's#http://127.0.0.1:2379#http://192.168.1.132:2379#g' /etc/sysconfig/flanneld

多网卡的话需要在LANNEL_ETCD_ENDPOINTS项中增加--iface=网卡名

这里/etc/sysconfig/flanneld可以设置密钥验证,详情请自行百度!

3、Master节点配置etcd中关于flanneld的Key

1
2
etcdctl mk /atomic.io/network/config  '{ "Network": "172.16.0.0/16" }'
etcdctl get /atomic.io/network/config

这里的/atomic.io/network需要和/etc/sysconfig/flanneld里的FLANNEL_ETCD_PREFIX配置对应。

4、设置flanneld启动配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@localhost /]# vim /usr/lib/systemd/system/flanneld.service
[Unit]
Description=Flanneld overlay address etcd agent
After=network.target
After=network-online.target
Wants=network-online.target
After=etcd.service
Before=docker.service

[Service]
Type=notify
EnvironmentFile=/etc/sysconfig/flanneld
EnvironmentFile=-/etc/sysconfig/docker-network
ExecStart=/usr/bin/flanneld-start $FLANNEL_OPTIONS
ExecStartPost=/usr/libexec/flannel/mk-docker-opts.sh -k DOCKER_NETWORK_OPTIONS -d /run/flannel/docker
Restart=on-failure

[Install]
WantedBy=multi-user.target
WantedBy=docker.service

5、设置Docker启动配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
[root@localhost /]# vim /usr/lib/systemd/system/docker.service
[Unit]
Description=Docker Application Container Engine
Documentation=http://docs.docker.com
After=network.target
Wants=docker-storage-setup.service
Requires=docker-cleanup.timer

[Service]
Type=notify
NotifyAccess=main
EnvironmentFile=/run/flannel/subnet.env #增加该行配置
EnvironmentFile=-/etc/sysconfig/docker
EnvironmentFile=-/etc/sysconfig/docker-storage
EnvironmentFile=-/etc/sysconfig/docker-network
Environment=GOTRACEBACK=crash
Environment=DOCKER_HTTP_HOST_COMPAT=1
Environment=PATH=/usr/libexec/docker:/usr/bin:/usr/sbin
#更改启动方式 如果没有更改过docker存储路径,不需要配置 --graph /home/docker
ExecStart=/usr/bin/dockerd --graph /home/docker $DOCKER_NETWORK_OPTIONS
#增加docker启动的防火墙拦截允许配置
ExecStartPost=/sbin/iptables -I FORWARD -s 0.0.0.0/0 -j ACCEPT
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=1048576
LimitNPROC=1048576
LimitCORE=infinity
TimeoutStartSec=0
Restart=on-abnormal
KillMode=process

[Install]
WantedBy=multi-user.target

6、启动flanneld

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
systemctl daemon-reload
systemctl start flanneld.service
systemctl enable flanneld.service

#重启Master节点服务
systemctl restart docker
systemctl restart kube-apiserver
systemctl restart kube-controller-manager
systemctl restart kube-scheduler
systemctl restart kubelet
systemctl restart kube-proxy

#重启Node节点服务
systemctl restart docker
systemctl restart kubelet
systemctl restart kube-proxy

7、测试网段

以上的一系列操作,主要是为了让flanneld和docker创建的网络处于同一个网段,先通过设置etcd设置flanneld的网段范围,再配置docker启动前加载flanneld的配置
kubernetes-1
从图中能够看到docker0flannel0都处于同一个网段172.16.0.0中,可以用一个轻巧的容器测试一下

1
2
3
4
#docker拉取网络镜像
[root@localhost /]# docker pull docker.io/busybox
#分别在Master节点及Node节点执行命令
[root@localhost /]# docker run -it docker.io/busybox:latest

kubernetes-2
kubernetes-3
从图中可以看到,创建了两个容器,IP分别是172.16.43.6172.16.43.4互相能够Ping通。

如果不能Ping通,则在每个Node节点上都配置相应的静态路由项

1
2
3
4
#Master节点 #172.16.9.0 为Node节点的flannel0的IP
[root@localhost ~]# route add -net 172.16.9.0 netmask 255.255.255.0 gw 192.168.1.134
#Node节点 #172.16.43.0 为Master节点的flannel0的IP
[root@localhost ~]# route add -net 172.16.43.0 netmask 255.255.255.0 gw 192.168.1.132

这意味着,每一个新部署的容器都将使用这个Node(docker0的网桥IP)作为它的默认网关。而这些Node(类似路由器)都有其他docker0的路由信息,这样它们就能够相互连通了。

最后更新: 2021年03月09日 11:19

原始链接: https://midkuro.gitee.io/2020/05/21/kubernetes-install/

× 请我吃糖~
打赏二维码