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的路由信息,这样它们就能够相互连通了。