去年2月我写过一篇kubernets部署备忘 ,当时基于v1.5.2,现在看有些地方已经跟当前版本对不上了,有读者发邮件来咨询,由于我也很久没部署过k8s了,索性新写一篇教程,重温一下,喜迎九一。

本教程:

  • 基于当前1.11.2版本
  • 基于ubuntu
  • All in ONE
  • 绝对不翻墙!

我用的机器是一台老笔记本ThinkPad X201,4核8GB,标准的Java虚机配置,用来跑kubernetes尚可。操作系统是ubuntu 16.04 Desktop版本,更新到最新。这台机器特意没有配置任何翻墙工具。

准备工作

更换apt源为163

$ cat /etc/apt/sources.list
deb http://mirrors.163.com/ubuntu/ xenial main
deb-src http://mirrors.163.com/ubuntu/ xenial main

deb http://mirrors.163.com/ubuntu/ xenial-updates main
deb-src http://mirrors.163.com/ubuntu/ xenial-updates main

deb http://mirrors.163.com/ubuntu/ xenial universe
deb-src http://mirrors.163.com/ubuntu/ xenial universe
deb http://mirrors.163.com/ubuntu/ xenial-updates universe
deb-src http://mirrors.163.com/ubuntu/ xenial-updates universe

deb http://mirrors.163.com/ubuntu/ xenial-security main
deb-src http://mirrors.163.com/ubuntu/ xenial-security main
deb http://mirrors.163.com/ubuntu/ xenial-security universe
deb-src http://mirrors.163.com/ubuntu/ xenial-security universe

安装docker

apt install docker.io -y

安装后docker版本为17.03.2-ce。

增加kubernetes aliyun镜像源

apt-get update && apt-get install -y apt-transport-https
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add - 
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF

安装kubeadm/kubelet/kubectl

apt-get update
apt-get install -y kubelet kubeadm kubectl
apt-mark hold kubelet kubeadm kubectl

如果你有多台机器,非master节点不需要安装kubeadm/kubectl。当然装了也没啥坏处。

关闭swap

kubernetes要求必须关闭swap。

这次装机遗憾的地方就是忘记把swap给关掉了。不接受“为啥要关swap啊”的讨论。其实我在公司的台式机是开着的,因为狗日的内存只有8GB,我用的又是deepin,非常耗内存,但服务器上,别开swap,宁死不要swap,用户可没我这么好脾气。

swapoff -a

同时把/etc/fstab包含swap那行记录删掉。

配置docker mirror

创建(或修改)/etc/docker/daemon.json。官方中国镜像速度还行。

{
"registry-mirrors": ["https://registry.docker-cn.com"]
}

重启docker服务

systemctl restart docker

拉取k8s的包并tag

首先查询下当前版本需要哪些docker image。

$ kubeadm config images list --kubernetes-version v1.11.2
k8s.gcr.io/kube-apiserver-amd64:v1.11.2
k8s.gcr.io/kube-controller-manager-amd64:v1.11.2
k8s.gcr.io/kube-scheduler-amd64:v1.11.2
k8s.gcr.io/kube-proxy-amd64:v1.11.2
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd-amd64:3.2.18
k8s.gcr.io/coredns:1.1.3

必须要指定版本,这样kubeadm才不会去连k8s.io。kubeadm init同理。

推荐使用anjia0532的镜像,机器人自动跟官方同步,非常及时。

docker pull anjia0532/google-containers.kube-controller-manager-amd64:v1.11.2
docker pull anjia0532/google-containers.kube-apiserver-amd64:v1.11.2
docker pull anjia0532/google-containers.kube-scheduler-amd64:v1.11.2
docker pull anjia0532/google-containers.kube-proxy-amd64:v1.11.2
docker pull anjia0532/google-containers.pause:3.1
docker pull anjia0532/google-containers.etcd-amd64:3.2.18
docker pull anjia0532/google-containers.coredns:1.1.3

docker tag anjia0532/google-containers.kube-controller-manager-amd64:v1.11.2 k8s.gcr.io/kube-controller-manager-amd64:v1.11.2
docker tag anjia0532/google-containers.kube-apiserver-amd64:v1.11.2 k8s.gcr.io/kube-apiserver-amd64:v1.11.2
docker tag anjia0532/google-containers.kube-scheduler-amd64:v1.11.2 k8s.gcr.io/kube-scheduler-amd64:v1.11.2
docker tag anjia0532/google-containers.kube-proxy-amd64:v1.11.2 k8s.gcr.io/kube-proxy-amd64:v1.11.2
docker tag anjia0532/google-containers.pause:3.1 k8s.gcr.io/pause:3.1
docker tag anjia0532/google-containers.etcd-amd64:3.2.18 k8s.gcr.io/etcd-amd64:3.2.18
docker tag anjia0532/google-containers.coredns:1.1.3 k8s.gcr.io/coredns:1.1.3

docker rmi anjia0532/google-containers.kube-controller-manager-amd64:v1.11.2
docker rmi anjia0532/google-containers.kube-apiserver-amd64:v1.11.2
docker rmi anjia0532/google-containers.kube-scheduler-amd64:v1.11.2
docker rmi anjia0532/google-containers.kube-proxy-amd64:v1.11.2
docker rmi anjia0532/google-containers.pause:3.1
docker rmi anjia0532/google-containers.etcd-amd64:3.2.18
docker rmi anjia0532/google-containers.coredns:1.1.3

开始安装master

好了,万事俱备,开始安装master。

kubeadm init --kubernetes-version v1.11.2

我这里准备使用weave Network(主要是想用下weave scope,它只支持weave类型的网络)。

注意如果是flannel网络方案,必须要设置--pod-network-cidr 10.244.0.0/16,其他类型的网络,请参考官方的说明

部署weave网络

sysctl net.bridge.bridge-nf-call-iptables=1 -w
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"

准备计算资源

因为我只有1个节点,要“计算资源”的话,就只能将master节点的taint去掉,否则普通的Pod默认不会调度上来。

kubectl taint nodes --all node-role.kubernetes.io/master-

如果你有多个节点的话,不需要去掉master的taint。其他节点参照上面的准备阶段在各个节点上做好准备工作以后,只要再Join一下就行了。Join命令在kubeadm init的输出信息里有。

kubeadm join --token={token} {master ip}

安装weave scope

kubectl apply -f "https://cloud.weave.works/k8s/scope.yaml?k8s-version=$(kubectl version | base64 | tr -d '\n')"

weave

全程不翻墙!

btw:推荐weave scope,用过以后,就会觉得我们开发的这些管控,太low了。