Kubernetes学习笔记(三)------运行Kubernetes集群

一、创建Kubernetes集群

选择正确的解决方案:

  • 如果你只是想试一试Kubernetes,我们推荐基于Docker的本地方案。
  • 基于Docker的本地方案是众多能够完成快速搭建的本地集群方案中的一种,但是局限于单台机器。
  • 当你准备好扩展到多台机器和更高可用性时,托管解决方案是最容易搭建和维护的。
  • 全套云端方案 只需要少数几个命令就可以在更多的云服务提供商搭建Kubernetes。
  • 定制方案 需要花费更多的精力,但是覆盖了从零开始搭建Kubernetes集群的通用建议到分步骤的细节指引。

以下用表格形式列出上面的所有方案。

IaaS Provider Config.Mgmt OS Networking Docs Conforms  
GKE     GCE docs [✓][3]  
Vagrant Saltstack Fedora flannel docs [✓][2]  
GCE Saltstack Debian GCE docs [✓][1]  
Azure CoreOS CoreOS Weave docs    
Docker Single Node custom N/A local docs    
Docker Multi Node Flannel N/A local docs    
Bare-metal Ansible Fedora flannel docs    
Digital Ocean custom Fedora Calico docs    
Bare-metal custom Fedora none docs    
Bare-metal custom Fedora flannel docs    
libvirt custom Fedora flannel docs    
KVM custom Fedora flannel docs    
             
Mesos/Docker custom Ubuntu Docker docs    
Mesos/GCE       docs    
AWS CoreOS CoreOS flannel docs    
GCE CoreOS CoreOS flannel docs    
Vagrant CoreOS CoreOS flannel docs    
Bare-metal (Offline) CoreOS CoreOS flannel docs    
Bare-metal CoreOS CoreOS Calico docs    
CloudStack Ansible CoreOS flannel docs    
Vmware   Debian OVS docs    
Bare-metal custom CentOS none docs    
AWS Juju Ubuntu flannel docs    
OpenStack/HPCloud Juju Ubuntu flannel docs    
Joyent Juju Ubuntu flannel docs    
AWS Saltstack Ubuntu OVS docs    
Azure Saltstack Ubuntu OpenVPN docs    
Bare-metal custom Ubuntu Calico docs    
Bare-metal custom Ubuntu flannel docs    
Local     none docs    
libvirt/KVM CoreOS CoreOS libvirt/KVM docs    
oVirt       docs    
Rackspace CoreOS CoreOS flannel docs    
any any any any docs    

注意:以上表格按照支持级别和测试及使用的版本进行排序。表格中列说明:

  • IaaS Provider 是指提供Kubernetes运行环境的虚拟机或物理机(节点)资源的提供商。
  • OS 是指节点上运行的基础操作系统。
  • Config. Mgmt 是指节点上安装和管理Kubernetes软件的的配置管理系统。
  • Networking 是指实现网络模型的软件。 none 表示只支持一个节点,或支持单物理节点 上的虚拟机节点。
  • Conformance 表示使用该种配置创建的集群是否通过了项目一致性测试,支持

Kubernetes v1.0.0的API和基本特性。

  • Support Levels(支持级别)
  • Project:Kubernetes贡献者们经常使用该配置,所以通常最新的版本可使用。
  • Commercial:某些厂商负责在自己的平台支持。
  • Community:在社区中有活跃支持,但可能最新版本不适用。
  • Inactive: 对于初次使用Kubernetes的用户不推荐,并且有可能在将来被移除。
  • Notes 说明,比如适用的Kubernetes版本。

二、 在Ubuntu快速搭建k8s demo

1.环境设置(两台虚拟机都进行设置):在Ubuntu16.04安装,关闭ufw防火墙,Ubuntu默认未启用,无需设置。

$ sudo ufw disable  

禁用SELINUX,ubuntu默认不安装selinux,假如安装了的话,按如下步骤禁用selinux,临时禁用(重启后失效)

$ sudo setenforce 0                 #0代表permissive 1代表enforcing

永久禁用

$ sudo vi /etc/selinux/config
SELINUX=permissive     

内核开启ipv4转发,修改/etc/sysctl.conf,开启ipv4转发

 sudo vim /etc/sysctl.conf
net.ipv4.ip_forward = 1             #开启ipv4转发,允许内置路由

写入后执行如下命令生效:

$ sudo sysctl -p

数据包经过路由后,假如不是发往本机的流量,下一步会走iptables的FORWARD链,而docker从1.13版本开始,将FORWARD链的默认策略设置为DROP,会导致出现一些例如跨主机的两个pod使用podIP互访失败等问题。解决方案有2个:

在所有节点上开机启动时执行iptables -P FORWARD ACCEPT,让docker不操作iptables,方案一,临时生效:

$ sudo iptables -P FORWARD ACCEPT

iptables的配置重启后会丢失,可以将配置写进/etc/rc.local中,重启后自动执行:

/usr/sbin/iptables -P FORWARD ACCEPT

方案二,设置docker启动参数添加--iptables=false选项,使docker不再操作iptables,比如1.10版以上可编辑docker daemon默认配置文件/etc/docker/daemon.json:

{
    "iptables": false
}

禁掉所有的swap分区

$ sudo swapoff -a

同时还需要修改/etc/fstab文件,注释掉 SWAP 的自动挂载,防止机子重启后swap启用。修改/etc/fstab 文件,它永久性地关闭swap space, 只需在下面两行前面加上(#),然后重启虚拟机。Kubernetes学习笔记(三)------运行Kubernetes集群_第1张图片

配置iptables参数,使得流经网桥的流量也经过iptables/netfilter防火墙:

$ sudo tee /etc/sysctl.d/k8s.conf <<-'EOF'
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

$ sudo sysctl --system

2.(两台虚拟机都进行设置)一定要改每台虚拟机的主机名,进入系统设置,选择Detail,进入Overview,直接修改DeviceName,Master节点和Node节点都需要改,而且不能重名。

主机名    IP
ubuntu-master    192.168.246.128
kube-slave    192.168.246.129

3.( 两台虚拟机都进行设置)安装docker-18.03.1
卸载旧docke

$ sudo apt-get remove docker docker-engine docker.io    

安装依赖,使得apt可以使用https:

sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common

添加docker的GPG key:

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -


国内访问download.docker.com不稳定的话可以使用阿里云的:

$ curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -

设置docker镜像源:

$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

国内访问download.docker.com不稳定的话可以使用阿里云镜像源:

$ sudo add-apt-repository \
   "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

安装指定版本docker-ce,查看源中都有哪些版本:

$ apt-cache madison docker-ce
 docker-ce | 18.06.1~ce~3-0~ubuntu | https://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
 docker-ce | 18.06.0~ce~3-0~ubuntu | https://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
 docker-ce | 18.03.1~ce~3-0~ubuntu | https://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages

安装18.03.1版:

$ sudo apt-get install -y docker-ce=18.03.1~ce~3-0~ubuntu

启动并设置开机自启动docker:

$ sudo systemctl enable docker && sudo systemctl start docker

将当前登录用户username加入docker用户组中:

$ sudo usermod -aG docker username

然后退出,重新登录,使用docker命令就不用加sudo了。

docker启动参数配置(选修),为docker做如下配置:

设置阿里云镜像库加速dockerhub的镜像。国内访问dockerhub不稳定,将对dockerhub的镜像拉取代理到阿里云镜像库配上1.3.2的禁用iptables的设置,如果想让podIP可路由的话,设置docker不再对podIP做MASQUERADE,否则docker会将podIP这个源地址SNAT成nodeIP,设置docker存储驱动为overlay2(需要linux kernel版本在4.0以上,docker版本大于1.12),根据业务规划修改容器实例存储根路径(默认路径是/var/lib/docker),最终配置如下:

$ sudo tee /etc/docker/daemon.json <<-'EOF'
{
 "registry-mirrors": ["https://xxxxxxxx.mirror.aliyuncs.com"],
 "iptables": false,
 "ip-masq": false,
 "storage-driver": "overlay2",
 "graph": "/home/lk/docker"
}
EOF

$ sudo systemctl restart docker

备注:docker的所有启动参数可见:https://docs.docker.com/engine/reference/commandline/dockerd/
将xxxxxxxx替换成阿里云为你生成的镜像代理仓库前缀
4.安装kubeadm、kubelet、kubectl(两台虚拟机)
 apt安装, 创建kubernetes的repo,创建kubernetes的source文件,google地址被墙的情况下可以使用阿里云或者中科大的镜像站:

sudo apt-get update && sudo apt-get install -y apt-transport-https curl

sudo curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -

sudo tee /etc/apt/sources.list.d/kubernetes.list <<-'EOF'
deb https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial main
EOF

sudo apt-get update

 安装kubeadm、kubelet、kubectl,查看可用软件版本:

$ apt-cache madison kubeadm
   kubeadm |  1.12.1-00 | https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main amd64 Packages
   kubeadm |  1.12.0-00 | https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main amd64 Packages
   kubeadm |  1.11.3-00 | https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main amd64 Packages
   ......

安装指定版本:

$ sudo apt-get install -y kubelet=1.12.0-00 kubeadm=1.12.0-00 kubectl=1.12.0-00
$ sudo apt-mark hold kubelet=1.12.0-00 kubeadm=1.12.0-00 kubectl=1.12.0-00

设置开机自启动并运行kubelet:

sudo systemctl enable kubelet && sudo systemctl start kubelet

5.master节点部署(ubuntu-master虚拟机)
提前下载所需镜像,看一下kubernetes v1.12.0需要哪些镜像:

$ kubeadm config images list --kubernetes-version=v1.12.0

k8s.gcr.io/kube-apiserver:v1.12.0
k8s.gcr.io/kube-controller-manager:v1.12.0
k8s.gcr.io/kube-scheduler:v1.12.0
k8s.gcr.io/kube-proxy:v1.12.0
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.2.24
k8s.gcr.io/coredns:1.2.2

由于gcr.io被墙,从anjia0532镜像地址下载:

docker pull anjia0532/google-containers.kube-apiserver:v1.12.0
docker pull anjia0532/google-containers.kube-controller-manager:v1.12.0
docker pull anjia0532/google-containers.kube-scheduler:v1.12.0
docker pull anjia0532/google-containers.kube-proxy:v1.12.0
docker pull anjia0532/google-containers.pause:3.1
docker pull anjia0532/google-containers.etcd:3.2.24
docker pull anjia0532/google-containers.coredns:1.2.2

重新打回k8s.gcr.io的镜像tag:

docker tag anjia0532/google-containers.kube-apiserver:v1.12.0 k8s.gcr.io/kube-apiserver:v1.12.0
docker tag anjia0532/google-containers.kube-controller-manager:v1.12.0 k8s.gcr.io/kube-controller-manager:v1.12.0
docker tag anjia0532/google-containers.kube-scheduler:v1.12.0 k8s.gcr.io/kube-scheduler:v1.12.0
docker tag anjia0532/google-containers.kube-proxy:v1.12.0 k8s.gcr.io/kube-proxy:v1.12.0
docker tag anjia0532/google-containers.pause:3.1 k8s.gcr.io/pause:3.1
docker tag anjia0532/google-containers.etcd:3.2.24 k8s.gcr.io/etcd:3.2.24
docker tag anjia0532/google-containers.coredns:1.2.2 k8s.gcr.io/coredns:1.2.2

使用kubeadmin初始化master节点:最后ip为本机ip

 kubeadm init --kubernetes-version=v1.12.0   --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.246.128

如下图执行成功,记住join命令:

Kubernetes学习笔记(三)------运行Kubernetes集群_第2张图片

如果执行的时候报错,提示说需要disable swap,因为Kubernetes v1.8+ 要求关闭系统 Swap,修改/etc/fstab 文件,它永久性地关闭swap space, 只需在下面两行前面加上(#),然后重启虚拟机。或者直接运行sudo swapoff -a,如果还出错,执行命令kubeadm reset之后,再执行kubeadm init,执行如下命令来配置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的节点就配置好了,并且可以使用kubectl来进行各种操作了,根据上面的提示接着往下做,需要安装一个网络插件。从canal官方文档参考,如下网址下载2个文件并且安装,其中一个是配置canal的RBAC权限,一个是部署canal的DaemonSet。但笔者是从这里(Installing a pod network add-on)参考的,根据kubeadm init时用到的--pod-network-cidr=10.244.0.0/16,所以选择了canal。命令(每次重启必须执行,不然无法通信):

$kubectl apply -f https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/canal/rbac.yaml
 
clusterrole.rbac.authorization.k8s.io "calico" created
clusterrole.rbac.authorization.k8s.io "flannel" created
clusterrolebinding.rbac.authorization.k8s.io "canal-flannel" created
clusterrolebinding.rbac.authorization.k8s.io "canal-calico" created
 
 
$kubectl apply -f https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/canal/canal.yaml
 
configmap "canal-config" created
daemonset.extensions "canal" created
customresourcedefinition.apiextensions.k8s.io "felixconfigurations.crd.projectcalico.org" created
customresourcedefinition.apiextensions.k8s.io "bgpconfigurations.crd.projectcalico.org" created
customresourcedefinition.apiextensions.k8s.io "ippools.crd.projectcalico.org" created
customresourcedefinition.apiextensions.k8s.io "clusterinformations.crd.projectcalico.org" created
customresourcedefinition.apiextensions.k8s.io "globalnetworkpolicies.crd.projectcalico.org" created
customresourcedefinition.apiextensions.k8s.io "networkpolicies.crd.projectcalico.org" created
serviceaccount "canal" created

执行以下命令:kubectl get pod -n kube-system -o wide即可查看安装效果

6.slave节点(另一台虚拟机)执行记录好的join命令:

kubeadm join 192.168.246.128:6443 --token aoanr5.geidnr74gvp5xrlc --discovery-token-ca-cert-hash sha256:beb198cf8a70ff17c96b387b06de16d6973f9b8cacb1a8e1586b52ff5f84db0c

报个错是因为少了一些kernel moudules,我们依次运行:

modprobe ip_vs
modprobe ip_vs_rr
modprobe ip_vs_wrr
modprobe ip_vs_sh
modprobe nf_conntrack_ipv4

如果还遇到swap的问题,可以运行sudo swapoff -a,然后再运行上面的kubeadm join的代码,最后就执行成功了,在Master 上运行kube get nodes, 结果如下:

root@ubuntu:/home/cong# kubectl get nodes
NAME            STATUS     ROLES     AGE       VERSION
kube-slave      Ready          1h       v1.12.0
ubuntu-master   Ready      master    1h       v1.12.0

备注:如果是notready,ubuntu-master每次重启必须要设置网络插件canal,kube-slave则必须通过Kubectl get node 获取节点状态、kubectl get pods -n kube-system -owide | grep kube-slave 获取有关该节点的所有pods、kubectl describe pod canal-xxxxx 获取该xxxx-pod的状态,读取日志分析错误。我的错误是镜像该节点下载不下来,所以采用将主节点镜像打包传递docker save 3030 > /home/ubuntu.tar 3030为镜像id,后面路径为输出路径,然后复制到另一台另一台虚拟机后执行docker load < /home/test02/ubuntu.tar ,最后docker tag name:tag来修改名字。

7.第三个slave节点,按照以上环境安装docker、k8s后,将Slave节点加入集群,创建另一台虚拟机,本文这里机器名称为kube-slave-3。你需要用root账户登录,执行su,输入root的密码,切换到root账户下:

su

增加新的Node节点到你的集群的命令如下:

kubeadm join --token  : --discovery-token-ca-cert-hash sha256:

: ,本文这里对应得是192.168.246.128:6443
token,一般token两天就过期了,如果过期了你需要重新创建(查看token命令是kubeadm token list,创建token命令是kubeadm token create),如下:

root@ubuntu:/home/cong# kubeadm token list
TOKEN                     TTL         EXPIRES                     USAGES                   DESCRIPTION                                                EXTRA GROUPS
u2oywj.j0hwpq6lgv41roic      2018-08-03T02:56:16-07:00   authentication,signing   The default bootstrap token generated by 'kubeadm init'.   system:bootstrappers:kubeadm:default-node-token
 
root@ubuntu:/home/cong# kubeadm token create
5w6qwh.8n0ektfrjdct3ib4

--discovery-token-ca-cert-hash,通过如下命令就可以得到:

root@ubuntu:/home/cong# openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
af9e070ea723dd2281c2ae2414c932832a012d40bc55dc9c747bb00e68602388

最后得到的join 命令如下:

kubeadm join 192.168.246.128:6443 --token 5w6qwh.8n0ektfrjdct3ib4 --discovery-token-ca-cert-hash sha256:af9e070ea723dd2281c2ae2414c932832a012d40bc55dc9c747bb00e68602388


执行它后,等待数秒,在master节点上运行kubectl get nodes就可以看到该节点被加上了。如下:

root@ubuntu:/home/cong# kubectl get nodes
NAME            STATUS     ROLES     AGE       VERSION
kube-slave      Ready          3d        v1.11.1
kube-slave-3    Ready          2m        v1.11.1
ubuntu-master   Ready      master    3d        v1.11.1

至此,slave 节点就被成功加入了。但如果我想删这个节点怎么办呢?执行下面两步就可以了。

kubectl drain  --delete-local-data --force --ignore-daemonsets
kubectl delete node 

 效果如下:

root@ubuntu:/home/cong# kubectl drain kube-slave-3 --delete-local-data --force --ignore-daemonsets
node/kube-slave-3 cordoned
WARNING: Ignoring DaemonSet-managed pods: canal-47vnh, kube-proxy-b4zds
root@ubuntu:/home/cong# kubectl delete node kube-slave-3
node "kube-slave-3" deleted
root@ubuntu:/home/cong# kubectl get nodes
NAME            STATUS     ROLES     AGE       VERSION
kube-slave      Ready          3d        v1.11.1
ubuntu-master   Ready      master    3d        v1.11.1

 

你可能感兴趣的:(Go)