Docker 生态环境已经越来越完善了,很多公司已经把部分或者全部生产环境迁移到 Docker 上。好处是无论使用自建机房的裸机还是各大云平台的虚拟机,过程都是一致的。运维管理流程在 Docker 平台的基础上也变得标准化。

发现很多 Kubernetes 的安装流程都是依赖于某些云平台的,比如只针对于 AWS EC2, 只针对于 GCP,或者 DigitalOcean 。

这篇流程应该适用于所有情况,包括你拿到一批裸机,或者在 AWS 和其他云平台拿到一批虚拟机,前提是只要你有这些机器的 root 权限即可完成安装。整个过程可以在你自己的机器上完成。前提是安装了 virtualbox 和 vagrant 。

开始之前

Vagrant 在这里的作用是在本机上启动 3 台虚拟机模拟整个安装过程。关于 Vagrant 的使用,可以参照我的其他文章。

Kubernetes 是 Google 开源的 Docker Orchestration 工具,类似的工具还有 Docker Swarm,Mesos, 以及单机的 Docker Compose 。Kubernetes 以及得到了越来越多公司生产环境的验证。

Kubernetes 的安装目前还是比较复杂,并且依照官方流程总会有这样那样的问题。所以这里把 Kubernetes 的集群安装过程记录下来。

Kubernetes 的控制端 kubectl 是一个文件,一般可以在任意地方执行进行集群的管理。

1. 初始化 3 台虚拟机

整个过程在实际的安装流程中可以省略。

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure(2) do |config|

  config.vm.define "node1", primary: true do |node|
    node.vm.box = "ubuntu/trusty64"
    node.vm.hostname = 'node1'
    node.vm.network :private_network, ip: "192.168.56.101"
    node.vm.network "forwarded_port", guest: 80, host: 1234
    node.vm.provider "virtualbox" do |vb|
      vb.memory = 1024
      vb.cpus = 1
      vb.name = "node1"
    end
  end

  config.vm.define "node2" do |node|
    node.vm.box = "ubuntu/trusty64"
    node.vm.hostname = 'node2'
    node.vm.network :private_network, ip: "192.168.56.102"
    node.vm.provider "virtualbox" do |vb|
      vb.memory = 1024
      vb.cpus = 1
      vb.name = "node2"
    end
  end

  config.vm.define "node3" do |node|
    node.vm.box = "ubuntu/trusty64"
    node.vm.hostname = 'node3'
    node.vm.network :private_network, ip: "192.168.56.103"
    node.vm.provider "virtualbox" do |vb|
      vb.memory = 1024
      vb.cpus = 1
      vb.name = "node3"
    end
  end

  config.vm.boot_timeout = 120
  config.vm.synced_folder "../data", "/data"

end

将以上配置保存成 Vagrantfile 文件即可,然后在当前目录执行 vagrant up 命令,很快就可以拿到 3 台虚拟机。

执行 vagrant status 可以得到 3 台虚拟机的状态:

node1                     running (virtualbox)
node2                     running (virtualbox)
node3                     running (virtualbox)

在这里虚拟机的 IP 分别是:

node1 192.168.56.101
node2 192.168.56.102
node3 192.168.56.103

2. 初始化 ubuntu 服务器,安装 docker 服务

vagrant ssh node1 进入服务器,并且执行

sudo su -s
apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
/etc/apt/sources.list.d/docker.list
deb https://apt.dockerproject.org/repo ubuntu-trusty main
apt-get update
apt-get install ssh -y
apt-get install curl -y
apt-get install git -y
apt-get install bridge-utils
apt-get install docker-engine

依次在所有机器上进行相同的初始化操作,当然这些初始化工作可以用自动化工具实现,比如 ansible 。这里为了表达清楚,都用手动执行。

3. 添加统一权限

假设 node1 为 master,在所有机器上增加权限,这里新生成一对秘钥并且添加到所有机器上:

ssh-keygen -t rsa

生成后的位置 /root/.ssh/id_rsa
将公钥 /root/.ssh/id_rsa.pub 复制到所有机器上的 /root/.ssh/authorized_keys 文件中。

4. 在 node1 主节点上安装 kubernetes:

wget https://github.com/GoogleCloudPlatform/kubernetes/releases/download/v1.4.0/kubernetes.tar.gz
tar -xvf kubernetes.tar.gz
# 修改配置文件的以下几行
vi kubernetes/cluster/ubuntu/config-default.sh

export nodes=${nodes:-"root@192.168.56.101 root@192.168.56.101 root@192.168.56.101"}
roles=${roles:-"ai i i"}
export NUM_NODES=${NUM_NODES:-3}

cd kubernetes/cluster
# 这个需要特殊处理,否则默认官方流程会报错,缺少文件,这些文件需要先解压。
cp -a ../server/kubernetes/saltbase .
cp ../server/bin/kubectl /usr/bin/

5. 启动 kubernetes 集群

KUBERNETES_PROVIDER=ubuntu ./kube-up.sh

启动过程的输出信息如下:

Deploying master and node on machine 192.168.56.101
make-ca-cert.sh                                                                                                                          100% 4136     4.0KB/s   00:00
easy-rsa.tar.gz                                                                                                                          100%   42KB  42.4KB/s   00:00
config-default.sh                                                                                                                        100% 5595     5.5KB/s   00:00
util.sh                                                                                                                                  100%   29KB  28.9KB/s   00:00
kubelet.conf                                                                                                                             100%  645     0.6KB/s   00:00
kube-proxy.conf                                                                                                                          100%  688     0.7KB/s   00:00
kubelet                                                                                                                                  100% 2158     2.1KB/s   00:00
kube-proxy                                                                                                                               100% 2233     2.2KB/s   00:00
kube-controller-manager.conf                                                                                                             100%  761     0.7KB/s   00:00
kube-scheduler.conf                                                                                                                      100%  682     0.7KB/s   00:00
kube-apiserver.conf                                                                                                                      100%  682     0.7KB/s   00:00
etcd.conf                                                                                                                                100%  707     0.7KB/s   00:00
kube-apiserver                                                                                                                           100% 2358     2.3KB/s   00:00
kube-scheduler                                                                                                                           100% 2360     2.3KB/s   00:00
etcd                                                                                                                                     100% 2073     2.0KB/s   00:00
kube-controller-manager                                                                                                                  100% 2672     2.6KB/s   00:00
reconfDocker.sh                                                                                                                          100% 2082     2.0KB/s   00:00
etcdctl                                                                                                                                  100%   14MB  13.7MB/s   00:00
kube-apiserver                                                                                                                           100%  144MB  72.1MB/s   00:02
kube-scheduler                                                                                                                           100%   77MB  77.0MB/s   00:01
etcd                                                                                                                                     100%   16MB  15.9MB/s   00:00
flanneld                                                                                                                                 100%   16MB  15.8MB/s   00:00
kube-controller-manager                                                                                                                  100%  135MB 134.5MB/s   00:01
kubelet                                                                                                                                  100%  123MB  61.4MB/s   00:02
kube-proxy                                                                                                                               100%   69MB  69.5MB/s   00:01
flanneld                                                                                                                                 100%   16MB  15.8MB/s   00:00
flanneld.conf                                                                                                                            100%  579     0.6KB/s   00:00
flanneld                                                                                                                                 100% 2121     2.1KB/s   00:00
flanneld.conf                                                                                                                            100%  570     0.6KB/s   00:00
flanneld                                                                                                                                 100% 2131     2.1KB/s   00:00
etcd start/running, process 5093
etcd cluster has no published client endpoints.
Try '--no-sync' if you want to access non-published client endpoints(http://127.0.0.1:2379,http://127.0.0.1:4001).
Error:  client: no endpoints available
etcd cluster has no published client endpoints.
Try '--no-sync' if you want to access non-published client endpoints(http://127.0.0.1:4001,http://127.0.0.1:2379).
Error:  client: no endpoints available
Error:  100: Key not found (/coreos.com) [24]
{"Network":"172.16.0.0/16", "Backend": {"Type": "vxlan"}}
{"Network":"172.16.0.0/16", "Backend": {"Type": "vxlan"}}
docker stop/waiting
docker start/running, process 5314
Connection to 192.168.56.101 closed.

Deploying node on machine 192.168.56.102
config-default.sh                                                                                                                        100% 5595     5.5KB/s   00:00
util.sh                                                                                                                                  100%   29KB  28.9KB/s   00:00
reconfDocker.sh                                                                                                                          100% 2082     2.0KB/s   00:00
kubelet.conf                                                                                                                             100%  645     0.6KB/s   00:00
kube-proxy.conf                                                                                                                          100%  688     0.7KB/s   00:00
kubelet                                                                                                                                  100% 2158     2.1KB/s   00:00
kube-proxy                                                                                                                               100% 2233     2.2KB/s   00:00
kubelet                                                                                                                                  100%  123MB  61.4MB/s   00:02
kube-proxy                                                                                                                               100%   69MB  69.5MB/s   00:01
flanneld                                                                                                                                 100%   16MB  15.8MB/s   00:01
flanneld.conf                                                                                                                            100%  579     0.6KB/s   00:00
flanneld                                                                                                                                 100% 2121     2.1KB/s   00:00
flanneld start/running, process 3891
docker stop/waiting
docker start/running, process 4055
Connection to 192.168.56.102 closed.

Deploying node on machine 192.168.56.103
config-default.sh                                                                                                                        100% 5595     5.5KB/s   00:00
util.sh                                                                                                                                  100%   29KB  28.9KB/s   00:00
reconfDocker.sh                                                                                                                          100% 2082     2.0KB/s   00:00
kubelet.conf                                                                                                                             100%  645     0.6KB/s   00:00
kube-proxy.conf                                                                                                                          100%  688     0.7KB/s   00:00
kubelet                                                                                                                                  100% 2158     2.1KB/s   00:00
kube-proxy                                                                                                                               100% 2233     2.2KB/s   00:00
kubelet                                                                                                                                  100%  123MB  61.4MB/s   00:02
kube-proxy                                                                                                                               100%   69MB  69.5MB/s   00:01
flanneld                                                                                                                                 100%   16MB  15.8MB/s   00:00
flanneld.conf                                                                                                                            100%  579     0.6KB/s   00:00
flanneld                                                                                                                                 100% 2121     2.1KB/s   00:00
flanneld start/running, process 2266
docker stop/waiting
docker start/running, process 2433
Connection to 192.168.56.103 closed.
Validating master
Validating root@192.168.56.101
Validating root@192.168.56.102
Validating root@192.168.56.103
Using master 192.168.56.101
cluster "ubuntu" set.
user "ubuntu" set.
context "ubuntu" set.
switched to context "ubuntu".
Wrote config for ubuntu to /home/vagrant/.kube/config
... calling validate-cluster
Found 3 node(s).
NAME             STATUS    AGE
192.168.56.101   Ready     36s
192.168.56.102   Ready     22s
192.168.56.103   Ready     12s
Validate output:
NAME                 STATUS    MESSAGE              ERROR
controller-manager   Healthy   ok
scheduler            Healthy   ok
etcd-0               Healthy   {"health": "true"}
Cluster validation succeeded
Done, listing cluster services:

Kubernetes master is running at http://192.168.56.101:8080

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

6. 至此 Kubernetes 集群已经启动成功

根据提示信息,可以在浏览器打开 http://192.168.56.101:8080 查看 Kubernetes 的 API 已经可以访问了。

# 查看机器状态
kubectl get nodes
NAME             STATUS    AGE
192.168.56.101   Ready     1m
192.168.56.102   Ready     59s
192.168.56.103   Ready     49s

各台服务器的 Kubernetes 相关进程:

# node1:

/opt/bin/etcd -name infra -listen-client-urls http://127.0.0.1:4001,http://192.168.56.101:4001 -advertise-client-urls http://192.168.56.101:4001
/opt/bin/kube-scheduler --logtostderr=true --master=127.0.0.1:8080
/opt/bin/flanneld --etcd-endpoints=http://127.0.0.1:4001 --ip-masq --iface=192.168.56.101
/opt/bin/kube-apiserver --insecure-bind-address=0.0.0.0 --insecure-port=8080 --etcd-servers=http://127.0.0.1:4001 --logtostderr=true --service-cluster-ip-range=192.168.3.0/24 --admission-control=NamespaceLifecycle,LimitRanger,ServiceAccount,SecurityContextDeny,DefaultStorageClass,ResourceQuota --service-node-port-range=30000-32767 --advertise-address=192.168.56.101 --allow-privileged=false --client-ca-file=/srv/kubernetes/ca.crt --tls-cert-file=/srv/kubernetes/server.cert --tls-private-key-file=/srv/kubernetes/server.key
/opt/bin/kube-controller-manager --master=127.0.0.1:8080 --root-ca-file=/srv/kubernetes/ca.crt --service-account-private-key-file=/srv/kubernetes/server.key --logtostderr=true
/opt/bin/kubelet --hostname-override=192.168.56.101 --api-servers=http://192.168.56.101:8080 --logtostderr=true --cluster-dns=192.168.3.10 --cluster-domain=cluster.local --config= --allow-privileged=false
/opt/bin/kube-proxy --hostname-override=192.168.56.101 --master=http://192.168.56.101:8080 --logtostderr=true
/usr/bin/dockerd -H tcp://127.0.0.1:4243 -H unix:///var/run/docker.sock --bip=172.16.97.1/24 --mtu=1450 --raw-log

# node2:

/opt/bin/flanneld --etcd-endpoints=http://192.168.56.101:4001 --ip-masq --iface=192.168.56.102
/opt/bin/kubelet --hostname-override=192.168.56.102 --api-servers=http://192.168.56.101:8080 --logtostderr=true --cluster-dns=192.168.3.10 --cluster-domain=cluster.local --config= --allow-privileged=false
/opt/bin/kube-proxy --hostname-override=192.168.56.102 --master=http://192.168.56.101:8080 --logtostderr=true
/usr/bin/dockerd -H tcp://127.0.0.1:4243 -H unix:///var/run/docker.sock --bip=172.16.58.1/24 --mtu=1450 --raw-log

基本可以看出 Kubernetes 的各个部件 etcd,kube-scheduler,flanneld,kube-apiserver,kube-controller-manager,kubelet,kube-proxy,dockerd 和他们之间的关系。

7. 至此 Kubernetes 安装成功

但是默认并没有安装 UI 界面,可以这样安装:

cd ubuntu
KUBERNETES_PROVIDER=ubuntu ./deployAddons.sh

输出信息如下:

Creating kube-system namespace...
The namespace 'kube-system' is already there. Skipping.

Deploying DNS on Kubernetes
replicationcontroller "kube-dns-v19" created
service "kube-dns" created
Kube-dns rc and service is successfully deployed.

Creating Kubernetes Dashboard replicationController
replicationcontroller "kubernetes-dashboard-v1.4.0" created
Creating Kubernetes Dashboard service
service "kubernetes-dashboard" created

# 这个过程比较长,因为需要从远程 pull DNS 和 UI 的镜像
kubectl get pods --namespace=kube-system

NAME                                READY     STATUS              RESTARTS   AGE
kube-dns-v19-4di24                  0/3       ContainerCreating   0          2m
kubernetes-dashboard-v1.4.0-ovdxn   0/1       ContainerCreating   0          2m

# 直到 STATUS 变成 Running 就可以使用 UI 了

现在可以在 http://192.168.56.101:8080/ui 打开 Kubernetes Dashboard 的 UI 界面了。至此 Kubernetes 的安装基本完成。

8. 在本地操作集群

在 node1 可以看到这个集群的 kubectl 配置信息

kubectl config view

apiVersion: v1
clusters:
- cluster:
    insecure-skip-tls-verify: true
    server: http://192.168.56.101:8080
  name: ubuntu
contexts:
- context:
    cluster: ubuntu
    user: ubuntu
  name: ubuntu
current-context: ubuntu
kind: Config
preferences: {}
users:
- name: ubuntu
  user:
    password: X2EbdawoNlA83eds
    username: admin

在本地安装 kubectl 并且配置刚才初始化的 Kubernetes 集群的信息:

kubectl config set-cluster nodes --server=http://192.168.56.101:8080 --insecure-skip-tls-verify=true
kubectl config set-context nodes --cluster=nodes --user=cluster-admin
kubectl config set-credentials cluster-admin --username=admin --password=X2EbdawoNlA83eds

# 本地查看集群的机器
kubectl get nodes
NAME             LABELS                                                                                            STATUS
192.168.56.101   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=192.168.56.101   Ready
192.168.56.102   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=192.168.56.102   Ready
192.168.56.103   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=192.168.56.103   Ready

9. 停止 Kubernetes 集群

KUBERNETES_PROVIDER=ubuntu ./kube-down.sh

10. 销毁之前的 3 台本地虚拟机

vagrant destroy

注册 DigitalOcean 免费获得 $10 折扣

参考

  • https://docs.docker.com/engine/installation/linux/ubuntulinux/
  • http://kubernetes.io/docs/getting-started-guides/ubuntu/
  • 推荐这些相关文章

    订阅这个博客:

    关注我的微博:

    关注我的推特: