所有文章

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-* 这一行后面是 22 就表示创建成功了!如果等了很久还没有成功,可以通过以下命令查看原因:

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.comnode3.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-


编写日期:2017-07-15