k8s 快速部署 1.7
最近(2017.07.30)k8s 又发布了新版本,这个版本中增加了两种持久化存储方案,StorygeOS 与 Local ,为了一探究竟,我部署了一套最新版的 k8s 集群,虽然我在半年前部署过一次,并写过一篇 k8s-v1.5 版本部署的文篇,但那次的经验已经不再适用于新版本,这让我又体验了一次 k8s 的部署过程,这简直是种折磨,我现在新重新整理出来,希望给读者带来帮助。
环境说明
这次同样是用的 k8s 官方提供的快速安装工具 kubeadm
,这种方式依然被官方视为实验性功能,并不建议用在生产环境之中,先说明一下我的环境。
服务器三台:node1.docker.com, node2.docker.com, node3.docker.com
操作系统:CentOS 7.2-1511 64位 Docker 版本:1.12.6
Kubernetes 版本:1.7.0
部署方式:官方提供的 kubeadm 工具
准备 Linux
关于系统,我用的是 CentOS7.2,官方说的是只要 CentOS7 就可以,如果是 Ubuntu 的话,版本要在 Ubuntu 16.04 或以上,或者是 HypriotOS v1.0.1+ 系统,不过我没用过这个系统。。
安装 Docker
所有节点都需要做这个步骤,这里要提醒大家一下,如果你按照 Docker 官网给出的方式,通过官方提供的 repo 源安装了最新版的 Docker,最好卸载掉,然后重新安装 1.12.x 版本的 Docker,否则后导致后面初始化 K8s 时失败,我已经在这个环节上浪费掉很多时间了,,k8s 官方说 Docker-1.13.x 也是可以的,但我没有试过,,所以正确的安装姿势是,用 CentosOS 7.2 自带的 repo 源来安装,如果你的系统中有 /etc/yum.repos.d/docker.repo 这个文件的话,请移除,然后执行:
yum install docker-1.12.6 -y
如果你的系统自带的源中没有找到 docker,那可以尝试从 Docker 官网安装,但一定要是 1.12.x 的 Docker 版本,请参考Docker 官方文档。
安装完成后先不启动。
关于网络
k8s 在初次启动时会下载很多镜像,不过这只是针对 kubeadm 这种安装方式,它把 k8s 的各个模块全部以镜像的方式运行起来,如果全部用二进制码安装的话,是不需要这些镜像的。。那么下载镜像会有什么问题呢?问题大了,这些镜像是在 google 服务器上的,国内连接不到,这就需要读者自行搭梯子了,一般来讲这是必须的,因为每次使用 kubeadm 创建集群时它都会下载最新版本的镜像,所以提前把镱像下载这种方法并不凑效,搭梯子具体方法这里就不讨论了,我就假设你已经有自己的代理服务器了,它的址是:1.2.3.4:8000,这时需要在你的 ~/.bashrc 中加入三个变量,如下:
echo 'export HTTP_PROXY=http://1.2.3.4:8000' >> ~/.bashrc
echo 'export HTTPS_PROXY=http://1.2.3.4:8000' >> ~/.bashrc
echo 'export no_proxy="127.0.0.1,node1.docker.com"' >> ~/.bashrc
source .bashrc
使用 ping google.com
测试一下,如果能连接到 google 的话,恭喜你!已经成功一半了,,接下来是为 Docker 设置代理,光设置上面那些对 Docker 不生效的,方法很简单:
mkdir -p /etc/systemd/system/docker.service.d #先创建一个目录
cat > /etc/systemd/system/docker.service.d/http-proxy.conf <<-EOF
[Service]
Environment="HTTP_PROXY=http://10.100.124.236:8118" "HTTPS_PROXY=https://10.100.124.236:8118" "NO_PROXY=127.0.0.1,docker.io"
EOF
这时就可以启动 Docker 了:
systemctl start docker && docker info
安装 kubectl
执行以下两条命令来安装 kubectl
curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.7.0/bin/linux/amd64/kubectl
chmod +x ./kubectl && cp ./kubectl /usr/local/bin/kubectl
安装 kubeadm 和其它组件
这一步没有什么特别要注意的地方,唯一可能失败的原因就是代理没配置好,
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg
https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF
setenforce 0
yum install kubelet-1.7.0 kubeadm-1.7.0 kubectl-1.7.0 kubernetes-cni-0.5.1 -y
systemctl enable kubelet && systemctl start kubelet
使用 kubeadm 初始化主节点
这一步是关键,成败就在此一举了,开始之前还是先试一下网络是否 OK ,然后就开始初始化主节点吧:
[root@blog ~]# kubeadm init
[kubeadm] WARNING: kubeadm is in beta, please do not use it for production clusters.
[init] Using Kubernetes version: v1.7.0
[init] Using Authorization modes: [Node RBAC]
[preflight] Running pre-flight checks
[preflight] Starting the kubelet service
[certificates] Generated CA certificate and key.
[certificates] Generated API server certificate and key.
[certificates] API Server serving cert is signed for DNS names [kubeadm-master kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local] and IPs [10.96.0.1 10.138.0.4]
[certificates] Generated API server kubelet client certificate and key.
[certificates] Generated service account token signing key and public key.
[certificates] Generated front-proxy CA certificate and key.
[certificates] Generated front-proxy client certificate and key.
[certificates] Valid certificates and keys now exist in "/etc/kubernetes/pki"
[kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/admin.conf"
[kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/kubelet.conf"
[kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/controller-manager.conf"
[kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/scheduler.conf"
[apiclient] Created API client, waiting for the control plane to become ready
[apiclient] All control plane components are healthy after 16.502136 seconds
[token] Using token: <token>
[apiconfig] Created RBAC rules
[addons] Applied essential addon: kube-proxy
[addons] Applied essential addon: kube-dns
Your Kubernetes master has initialized successfully!
To start using your cluster, you need to run (as a regular user):
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
http://kubernetes.io/docs/admin/addons/
You can now join any number of machines by running the following on each node
as root:
kubeadm join --token c09068.cc1f3e78a73d9de6 1.2.3.4:6443
如果看到以上输出就表示成功了,这时先把最后一行复制到其它地方记下来。
这时很多人是在 [apiclient] Created API client, waiting for the control plane to become ready
这一步卡住了,第一个原因是就上面说到的网络,第二个原因就是 Docker 版本跟 k8s 不兼容,所以最好直接安装 1.12.6 版本。还有如果安装失败需要再次执行 kubeadm init
的话,需要先执行 kubeadm reset
来清理一下环境。
上面输出中提示需要我们手动做一些操作:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
还有一条命令,它可以让主节点即作为主节点也作为子节点,也一起执行一下吧:
kubectl taint nodes --all node-role.kubernetes.io/master-
安装 pod 网络
这一步是为集群搭建一个全局的网络环境,这样所有的 Docker 容器就可以跨物理机相互通信了,k8s 支持很多种全局网络,刚开始我用的是 flannel,拆腾半天还是不行,后来换成 weave 网络很容易就搭建成功了,命令如下:
kubectl apply -n kube-system -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
这时需要等一会,因为它需要下载几个相关镜像,通过以下命令来看它是否安装成功:
[root@blog ~]# kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system etcd-node1.docker.com 1/1 Running 0 1h
kube-system kube-apiserver-node1.docker.com 1/1 Running 0 1h
kube-system kube-controller-manager-node1.docker.com 1/1 Running 0 1h
kube-system kube-dns-2425271678-56l1g 0/3 Pending 0 1h
kube-system kube-proxy-s3vfd 1/1 Running 0 1h
kube-system kube-scheduler-node1.docker.com 1/1 Running 0 1h
kube-system weave-net-pwm3d 2/2 Running 0 38s
这时如果看到 weave-net-* 这一行后面是 2⁄2 就表示创建成功了!如果等了很久还没有成功,可以通过以下命令查看原因:
kubectl describe -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
加入其它节点
这里需要注意的是,先确认其它两台机器,也要主同节点一样,安装好 Docker、kubectl、kubelet、kubeadm 等等,然后要把主节点上的所有镜像同步到其它机器上,可以自己搭一个私有镜像仓库来同步,或者将主节点上的所有镜像通过 docker save 命令导出,然后通过 scp 发通到其它机器,再通过 docker load 命令导入。
镜像同步完成后,在 node2.docker.com
和 node3.docker.com
主机上执行命令刚才记下来那条命令,就可以将其它机器与主节点组成一个集群了,如下:
kubeadm join --token c09068.cc1f3e78a73d9de6 1.2.3.4:6443
执行完毕后,在主节点上执行以下命令查看集群中的节点:
[root@blog ~]# kubectl get node
NAME STATUS AGE VERSION
node1.docker.com Ready 8d v1.7.0
node2.docker.com Ready 8d v1.7.0
node3.docker.com Ready 8d v1.7.0
然后查看 k8s 所有模块是否都运行正常:
[root@blog ~]# kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system etcd-node1.docker.com 1/1 Running 1 8d
kube-system kube-apiserver-node1.docker.com 1/1 Running 1 8d
kube-system kube-controller-manager-node1.docker.com 1/1 Running 1 8d
kube-system kube-dns-2425271678-56l1g 3/3 Running 3 8d
kube-system kube-proxy-7s7bg 1/1 Running 0 8d
kube-system kube-proxy-s3vfd 1/1 Running 1 8d
kube-system kube-proxy-zv4l6 1/1 Running 0 8d
kube-system kube-scheduler-node1.docker.com 1/1 Running 1 8d
kube-system weave-net-pwm3d 2/2 Running 3 8d
kube-system weave-net-tp1dz 2/2 Running 0 8d
kube-system weave-net-zz2fm 2/2 Running 0 8d
这时应该看到三个 kube-proxy
与三个 weave-net
相关的 POD,并且 READY 那一列是全部在运行状态才对。
安装 Dashboard
官方提供的安装方式有点问题,我们先把要用到的 yaml 文件下载下来,对其做一点改动:
wget https://git.io/kube-dashboard
这时会得到一个 kubernetes-dashboard.yaml
文件,我们打开它,在最后的 Service 定义里,将其 9090 端口映射出来:
[root@blog ~]# vim kubernetes-dashboard.yaml
...
---
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kube-system
spec:
externalIPs:
- "1.2.3.4"
type: NodePort
ports:
- port: 9090
targetPort: 9090
selector:
k8s-app: kubernetes-dashboard
...
然后安装它:
kubectl create -f kubernetes-dashboard.yaml
然后用浏览器访问:http://1.2.3.4:9090
到这里 k8s 的部署就全部完成了,接下来你可以定义自己的各种 yaml 文件来创建服务。
-End-