k8s为何叫k8s呢?
由于k8s是Kubernetes的简称,由于K和S之间有8个字母,因此才会被称为k8s。
k8s最初是在Google公司内部使用了10多年的技术,它的前身是叫作Borg(博格),直到2015年才被Google公司捐赠为开源项目。node
若是以前咱们有接触过OpenStack,那么应该知道管理VM虚拟机资源能够用OpenStack。那么管理容器所对应的开源平台是什么呢?k8s就是其中之一,在k8s以前也有不少容器管理平台,有docker自身的docker swarm,也有apache推出的Mesos等等。相比较而言,虽然k8s比其余推出的晚了些,可是丝绝不影响其火爆程度,除了其功能强大外,更况且它还有个好爹。linux
关于k8s详细介绍可参考k8s中文文档git
1、环境准备github
主机名 | IP | 角色 | 基于服务 |
---|---|---|---|
docker-k8s01 | 192.168.171.151 | master | docker |
docker-k8s02 | 192.168.171.150 | node01 | docker |
docker-k8s03 | 192.168.171.152 | node02 | docker |
注:上述三台centos 7.3服务器,均运行docker服务,若是是测试环境,那么内存最少2G,CPU至少双核,而且docker服务的版本不建议太高,最好是18.09及如下
.
部署docker服务可参考:部署 Docker docker
2、部署前准备工做
一、检查docker版本、关闭防火墙及Selinux、清空iptables规则、禁用Swap交换分区shell
注:如下操做须要在三台docker主机上分别配置一次,哪怕是在生产环境,都须要进行如下操做,由于k8s有它本身的安全策略apache
#查看当前docker版本 [root@docker-k8s01 ~]# docker -v Docker version 18.09.0, build 4d60db4 #关闭防火墙 [root@docker-k8s01 ~]# systemctl stop firewalld [root@docker-k8s01 ~]# systemctl disable firewalld #禁用selinux [root@docker-k8s01 ~]# setenforce 0 setenforce: SELinux is disabled [root@docker-k8s01 ~]# vim /etc/sysconfig/selinux SELINUX=disabled # 修改成disabled #清空iptables规则 [root@docker-k8s01 ~]# iptables -F #重启docker服务 [root@docker-k8s01 ~]# systemctl daemon-reload [root@docker-k8s01 ~]# systemctl restart docker #禁用swap交换分区 [root@docker-k8s01 ~]# swapoff -a # 临时禁用交换分区 [root@docker-k8s01 ~]# vim /etc/fstab # 编辑自动挂载的配置文件,将swap配置项注释掉 #/dev/mapper/cl-swap swap swap defaults 0 0 [root@docker-k8s01 ~]# mount -a # 从新加载配置文件 [root@docker-k8s01 ~]# free -h # 查看分区信息,肯定swap行都为0 total used free shared buff/cache available Mem: 1.8G 469M 841M 18M 508M 1.2G Swap: 0B 0B 0B
二、配置ssh免密登陆、主机名解析及yum源
在master主机上操做便可,配置文件可直接复制到两台nodevim
#配置ssh免密登陆(为了方便在主机间复制配置文件,可忽略) [root@docker-k8s01 ~]# ssh-keygen -t rsa [root@docker-k8s01 ~]# ssh-copy-id docker-k8s02 [root@docker-k8s01 ~]# ssh-copy-id docker-k8s03 #配置域名解析 [root@docker-k8s01 ~]# tail -3 /etc/hosts 192.168.171.151 docker-k8s01 192.168.171.150 docker-k8s02 192.168.171.152 docker-k8s03 #将更改后的hosts文件发送到node01及node02 [root@docker-k8s01 ~]# scp /etc/hosts docker-k8s02:/etc/ [root@docker-k8s01 ~]# scp /etc/hosts docker-k8s03:/etc/ #配置k8s yum源,这里配置的阿里云的源,可上官网自行查看 [root@docker-k8s01 ~]# cat /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ enabled=1 gpgcheck=1 repo_gpgcheck=1 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg #查看刚刚配置的yum源中有没有可用的包 [root@docker-k8s01 ~]# yum repolist Loaded plugins: fastestmirror, langpacks kubernetes Kubernetes 551 # 返回的这一行不可为0 [root@docker-k8s01 ~]# yum makecache # 制做yum源缓存 #将yum源的配置文件复制到另外两台节点主机上 [root@docker-k8s01 ~]# scp /etc/yum.repos.d/kubernetes.repo docker-k8s02:/etc/yum.repos.d/ [root@docker-k8s01 ~]# scp /etc/yum.repos.d/kubernetes.repo docker-k8s03:/etc/yum.repos.d/ #在另外两台主机上,都需执行如下两条命令 [root@docker-k8s02 ~]# yum repolist kubernetes Kubernetes 551 # 切记这一行不可为0 [root@docker-k8s02 ~]# yum makecache
三、打开iptables桥接功能及路由转发
master上进行配置便可centos
#打开iptables桥接功能 [root@docker-k8s01 ~]# vim /etc/sysctl.d/k8s.conf # 写入 net.bridge.bridge-nf-call-iptables = 1 net.bridge.bridge-nf-call-ip6tables = 1 [root@docker-k8s01 ~]# sysctl -p /etc/sysctl.d/k8s.conf # 刷新并加载配置 net.bridge.bridge-nf-call-iptables = 1 net.bridge.bridge-nf-call-ip6tables = 1 # PS:若是报错“找不到文件”,须要执行下面的命令以便加载一个模块。 [root@docker-k8s01 ~]# modprobe br_netfilter #加载br_netfileter模块 #将k8s.conf文件复制到另外两台节点 [root@docker-k8s01 ~]# scp /etc/sysctl.d/k8s.conf docker-k8s02:/etc/sysctl.d/ [root@docker-k8s01 ~]# scp /etc/sysctl.d/k8s.conf docker-k8s03:/etc/sysctl.d/ #在两台node节点上也须要执行以下命令刷新配置 [root@docker-k8s02 ~]# sysctl -p /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-iptables = 1 net.bridge.bridge-nf-call-ip6tables = 1 #开启路由转发(三台docker主机上都须要进行如下操做) [root@docker-k8s01 ~]# echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf [root@docker-k8s01 ~]# sysctl -p net.ipv4.ip_forward = 1
初始化须要几个镜像文件,在初始化过程当中会自动下载,但要是网速慢的童鞋可能会很漫长,因此这里提早准备了须要的软件包(提取码:1231),一会上传上去导入便可
3、配置k8s群集api
一、安装部署k8s相关工具
注:如下操做在master主机上进行
#安装k8s的master所需组件 [root@docker-k8s01 ~]# yum -y install kubelet-1.15.0-0 kubeadm-1.15.0-0 kubectl-1.15.0-0 #将kubelet加入开机自启,但不要如今启动 [root@docker-k8s01 ~]# systemctl enable kubelet [root@docker-k8s01 ~]# mkdir images [root@docker-k8s01 ~]# cd images/ #将镜像包上传,共8个 [root@docker-k8s01 images]# ls coredns-1-3-1.tar kube-apiserver-1-15.tar kube-proxy-1-15.tar myflannel-11-0.tar etcd-3-3-10.tar kube-controller-1-15.tar kube-scheduler-1-15.tar pause-3-1.tar #接下来导入上传的镜像包到docker镜像中 [root@docker-k8s01 ~]# pwd # 注:脚本不要和镜像在同一个目录 /root [root@docker-k8s01 ~]# vim images.sh # 镜像比较多,写个小脚本代劳下 #!/bin/bash cd /root/images/ for i in `ls` do docker load < ${i} done echo "导入完成" [root@docker-k8s01 ~]# sh images.sh # 执行脚本,进行导入镜像
二、初始化k8s集群
[root@docker-k8s01 ~]# kubeadm init --kubernetes-version=v1.15.0 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --ignore-preflight-errors=Swap #这里指定的版本必须和前面yum安装的版本一致。指定的两个网络则是官方建议使用的网段 #若是执行上述命令后,返回CPU相关的报错信息,那么须要调大CPU的核心数 #初始化成功后,首先复制下面返回的这条命令,并妥善保存 #若初始化失败,能够执行kubeadm reset进行重置群集 kubeadm join 192.168.171.151:6443 --token oxgsxp.gis96136xisqgfzv \ --discovery-token-ca-cert-hash sha256:93c5aaa4710fabb9cb5bba9178bb75ecd90031bb4c2471e7ce72939d9ee0c711 #上面这条命令是用来其余节点加入到当前k8s群集中须要执行的 一旦丢失,特别麻烦,而且只有24小时有效期,每次初始化群集后产生的都不同 #接下来呢,依次执行返回的其余指令,以下(因为我是root用户,因此就省略了sudo指令) [root@docker-k8s01 ~]# mkdir -p $HOME/.kube [root@docker-k8s01 ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config [root@docker-k8s01 ~]# chown $(id -u):$(id -g) $HOME/.kube/config
三、配置master节点状态
[root@docker-k8s01 ~]# kubectl get nodes # 查看群集节点信息 NAME STATUS ROLES AGE VERSION docker-k8s01 NotReady master 2m57s v1.15.0 #能够看到master当前状态为未准备,不健康的
接下来能够去github官网进行如下操做以便查看相应的命令
点击进入后,下拉页面到如下位置,并复制指定的命令到master节点执行一下
[root@docker-k8s01 ~]# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
在网络情况良好的状况下建议使用上述方法(调用远端文件执行一下)
若网速较差,建议使用如下方法
#下载到本地 [root@docker-k8s01 ~]# wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml #开头连接中也有此文件可直接上传使用 [root@docker-k8s01 ~]# ls | grep flannel.yml kube-flannel.yml [root@docker-k8s01 ~]# kubectl apply -f kube-flannel.yml # 指定下载的.yml文件执行相应命令
#再次查看群集状态,能够看到master状态已经变为“ready” [root@docker-k8s01 ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION docker-k8s01 Ready master 12m v1.15.0 [root@docker-k8s01 ~]# ls /etc/kubernetes/ # k8s的配置文件目录 [root@docker-k8s01 ~]# ls /etc/kubernetes/manifests/ # k8s的.yaml文件存放目录
四、配置node01及node02加入master群集
#两台node节点都需执行以下操做 #安装k8s相关组件 [root@docker-k8s02 ~]# yum -y install kubelet-1.15.0-0 kubeadm-1.15.0-0 [root@docker-k8s02 ~]# systemctl enable kubelet # 设为开机自启,但不启动 [root@docker-k8s02 ~]# mkdir images [root@docker-k8s02 ~]# cd images/ [root@docker-k8s02 images]# ls # 上传以下三个镜像包 kube-proxy-1-15.tar myflannel-11-0.tar pause-3-1.tar [root@docker-k8s02 images]# docker load < kube-proxy-1-15.tar [root@docker-k8s02 images]# docker load < myflannel-11-0.tar [root@docker-k8s02 images]# docker load < pause-3-1.tar [root@docker-k8s02 images]# kubeadm join 192.168.171.151:6443 --token oxgsxp.gis96136xisqgfzv --discovery-token-ca-cert-hash sha256:93c5aaa4710fabb9cb5bba9178bb75ecd90031bb4c2471e7ce72939d9ee0c711 # 执行master初始化群集时返回的命令,以便加入到master的群集中
两台node节点上配置完成后,再次在master上查看群集信息
[root@docker-k8s01 ~]# kubectl get nodes # 在master上查看节点信息都为“Ready” NAME STATUS ROLES AGE VERSION docker-k8s01 Ready master 23m v1.15.0 docker-k8s02 Ready <none> 3m35s v1.15.0 docker-k8s03 NotReady <none> 4s v1.15.0
五、部署后的优化配置
为了之后更为方便的使用k8s,建议优化如下几项:
- 设置table键的默认间距;
- 设置kubectl命令自动补全;
- 优化开机自启配置。
1)设置table默认间距(该优化只需在master上进行配置便可,因为常常须要编写.yml文件因此才须要更改table间距)
[root@docker-k8s01 ~]# vim .vimrc # 将此参数写入.vimrc文件 [root@docker-k8s01 ~]# bash # 切换shell环境使配置生效
2)设置kubectl命令自动补全(master和node节点均可配置)
[root@docker-k8s01 ~]# yum -y install bash-completion [root@docker-k8s01 ~]# source /usr/share/bash-completion/bash_completion [root@docker-k8s01 ~]# source <(kubectl completion bash) [root@docker-k8s01 ~]# echo "source <(kubectl completion bash)" >> ~/.bashrc
3)确认k8s群集没有问题,并设置为开机自启
master主机操做以下
[root@docker-k8s01 ~]# kubectl get pod -n kube-system #查看pod资源,相似于docker中的容器,确保返回的信息都是running #“-n kube-system”:是k8s的名称空间
确保状态都为running
master和node节点上都须要进行如下操做,以便设置为开机自启
[root@docker-k8s01 ~]# systemctl enable kubelet [root@docker-k8s01 ~]# systemctl enable docker
设置为开机自启后,k8s群集的配置基本完成了,如今能够重启一下这三台服务器,若是重启后,执行下面的命令,状态都仍是running,则表示绝对没有问题了