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。 或者执行以下命令
编辑/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
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
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的配置 从图中能够看到docker0
和flannel0
都处于同一个网段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
从图中可以看到,创建了两个容器,IP分别是172.16.43.6
和172.16.43.4
互相能够Ping通。
如果不能Ping通,则在每个Node
节点上都配置相应的静态路由项
1 2 3 4 # Master节点 [root@localhost ~]# route add -net 172.16.9.0 netmask 255.255.255.0 gw 192.168.1.134 # Node节点 [root@localhost ~]# route add -net 172.16.43.0 netmask 255.255.255.0 gw 192.168.1.132
这意味着,每一个新部署的容器都将使用这个Node(docker0的网桥IP)作为它的默认网关。而这些Node(类似路由器)都有其他docker0的路由信息,这样它们就能够相互连通了。