一、创建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 |
注意:以上表格按照支持级别和测试及使用的版本进行排序。表格中列说明:
Kubernetes v1.0.0的API和基本特性。
二、 在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, 只需在下面两行前面加上(#),然后重启虚拟机。
配置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命令:
如果执行的时候报错,提示说需要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:
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