kubernetes是Google开源的基于Docker的容器集群管理系统,是谷歌内部大规模集群管理系统Borg的开源版本。kubernetes基于Borg集群软件模型。
Kubernetes(K8s)是一个真正的平台,提供运行环境,使得复杂要求的应用在上面构建。它通过yaml语言写的配置文件,很简单快速的就能自动通过Docker镜像部署好应用环境,支持应用横向扩展,并且可以组织、编排、管理和迁移这些容器化的应用。

本文主要介绍在Ubuntu16.04上使用kubeadm搭建kubernetes1.5.5环境。

kubeadm是kubernetes的自动部署化工具旨在改善开发者在安装、调试和使用k8s时的体验,降低安装和使用门槛。理论上通过两个命令:init和join即可搭建出一套完整的Kubernetes cluster。理论上通过kubeadm使用init和join命令即可建立一个集群,这init就是在master节点对集群进行初始化。和k8s之前的部署方式不同的是kubeadm安装的k8s核心组件都是以容器的形式运行于master node上的。
Kubeadm被设计成针对大规模集群部署环境中使用的,当然也可以很容易的手动安装。如果在你自己IaaS基础架构上或者已经存在的自动化系统上部署Kubernetes,kubeadm是一个很好的选择。

不过,kubeadm目前也在active development中,也不是那么stable,因此即便在当前最新的k8s 1.5.5版本中,它仍然处于Alpha状态,官方不建议在Production环境下使用。每次执行kubeadm init时,它都会打印如下提醒日志:

[kubeadm] WARNING: kubeadm is in alpha, please do not use it for production clusters.

一:前期环境准备与约束

  • Kubernetes官网上提到kubeadm支持的Ubuntu 16.04+, CentOS 7 or HypriotOSv1.0.1+三种操作系统。
  • 并且每台机器至少要有1GB内存,不然集群运行之后,留给运行在容器内的应用的内存就很少了。
  • 同时要保证所有机器之前的网络是互相连通的。

我准备了两台Ubuntu 16.04虚拟机,一个作为master,一个作为node。
Kubeadm默认安装时,master node将不会参与Pod调度,不会承载work load,即不会有非核心组件的Pod在Master node上被创建出来。当然通过kubectl taint命令可以解除这一限制,不过这是后话了。
准备了两台Ubuntu 16.04虚拟机,集群拓扑参数如下:

节点名     IP地址            CPU 内存
ubuntu-01   192.168.11.74   2核  4GB
ubuntu-02   192.168.11.75   2核  4GB

二:部署目标

  • 部署一套两个节点的Kubernetes集群。
  • 在集群上安装Pod网络插件flannel,允许POD之间相互通讯。
  • 在Kubernetes集群上部署一个微服务应用样例。

三 部署步骤

3.1 部署Kubernetes Master

安装内容包括:

  • docker:容器运行的软件。
  • kubelet:kubelet是Kubernets最重要的组件,它要运行在集群上所有的机器,用来执行类似于开启pods和容器。
  • kubectl:在集群运行时,控制容器的部件。只需要将其运行在主节点上,但是它将对所有节点都有效。
  • Kubeadm:集群部署工具。

以下命令,在两个Node上均要执行。

3.1.1 安装docker 和kubernetes组件

添加apt-key

apt-get update && apt-get install -y apt-transport-https
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -

添加Kubernetes源

cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb http://apt.kubernetes.io/ kubernetes-xenial main
EOF

更新包信息

apt-get update

安装docker

说明:此篇文档安装docker是集成与kubernetes源中的。如果需要提前安装或者单独安装docker 请参考:
https://docs.docker.com/engine/installation/linux/ubuntu/#install-docker

apt-get install -y docker.io 
#如果已经安装了docker这步可以跳过。

安装Kubernetes核心组件

apt-get install -y kubelet kubeadm kubectl kubernetes-cni
# 此处的Kubernetes的核心组件,包括kubelet、kubeadm、kubectl和kubernetes-cni等

下载后的kube组件会自动运行起来。在 /lib/systemd/system下面我们能看到kubelet.service:

# cat /lib/systemd/system/kubelet.service
[Unit]
Description=kubelet: The Kubernetes Node Agent
Documentation=http://kubernetes.io/docs/

[Service]
ExecStart=/usr/bin/kubelet
Restart=always
StartLimitInterval=0
RestartSec=10

[Install]
WantedBy=multi-user.target

注意:以上命令所有节点都需要执行。

3.1.2 初始化集群

理论上通过kubeadm使用init和join命令即可建立一个集群,这init就是在master节点对集群进行初始化。和k8s 之前的部署方式不同的是kubeadm安装的k8s核心组件都是以容器的形式运行于master node上的。所以需要一些镜像。

由于墙的原因无法直接访问到Google的软件仓库(packages.cloud.google.com)和容器仓库(gcr.io),解决方法有两种:一是直接配置的Hosts文件,二是使用三方源或转存的容器仓库。这里使用修改Hosts文件的方法。

把下面几行内容加入到hosts文件中

# vim  /etc/hosts
61.91.161.217 gcr.io
61.91.161.217 www.gcr.io
61.91.161.217 packages.cloud.google.com

最新可用的Google hosts文件可在这里获取:https://github.com/racaljk/hosts

kubeadm要从gcr.io/google_containers repository中pull许多核心组件的images,大约有如下一些:

gcr.io/google_containers/kube-apiserver-amd64            v1.5.5              18c9bd8bd15d        10 days ago         125.9 MB
gcr.io/google_containers/kube-controller-manager-amd64   v1.5.5              3f9819d4efc8        10 days ago         102.8 MB
gcr.io/google_containers/kube-proxy-amd64                v1.5.5              5e6f37c0b77c        10 days ago         173.5 MB
gcr.io/google_containers/kube-scheduler-amd64            v1.5.5              b06cdc92ebd9        10 days ago         54 MB
gcr.io/google_containers/etcd-amd64                      3.0.14-kubeadm      912882d31c95        4 months ago        174.9 MB
gcr.io/google_containers/kubedns-amd64                   1.9                 37c708a19f42        4 months ago        47 MB
gcr.io/google_containers/dnsmasq-metrics-amd64           1.0                 5271aabced07        4 months ago        14 MB
gcr.io/google_containers/kube-dnsmasq-amd64              1.4                 3ec65756a89b        6 months ago        5.13 MB
gcr.io/google_containers/kube-discovery-amd64            1.0                 592fd11e7a0f        6 months ago        134.2 MB
gcr.io/google_containers/exechealthz-amd64               1.2                 93a43bfb39bf        6 months ago        8.375 MB
gcr.io/google_containers/pause-amd64                     3.0                 99e59f495ffa        11 months ago       746.9 kB

3.1.3 初始化master

在Kubeadm的文档中,Pod Network的安装是作为一个单独的步骤的。kubeadm init并没有选择一个默认的Pod network进行安装。这里采用Flannel 作为Pod network,如果我们要使用Flannel,那么在执行init时,按照kubeadm文档要求,我们必须给init命令带上option:–pod-network-cidr=10.244.0.0/16。如果有多网卡的,可以根据实际情况配置–api-advertise-addresses=,单网卡情况可以省略。多网卡的并没有验证过。

使用kubeadm init初始化kubernetes master。执行kubeadm init命令:

# kubeadm init --pod-network-cidr=10.244.0.0/16 
[kubeadm] WARNING: kubeadm is in alpha, please do not use it for production clusters.
[preflight] Running pre-flight checks
[init] Using Kubernetes version: v1.5.5
[tokens] Generated token: "3c43f1.9a42d02deda012ef"
[certificates] Generated Certificate Authority key and certificate.
[certificates] Generated API Server key and certificate
[certificates] Generated Service Account signing keys
[certificates] Created keys and certificates in "/etc/kubernetes/pki"
[kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/kubelet.conf"
[kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/admin.conf"
[apiclient] Created API client, waiting for the control plane to become ready

[apiclient] All control plane components are healthy after 814.549686 seconds
[apiclient] Waiting for at least one node to register and become ready
[apiclient] First node is ready after 4.502786 seconds
[apiclient] Creating a test deployment
[apiclient] Test deployment succeeded
[token-discovery] Created the kube-discovery deployment, waiting for it to become ready
[token-discovery] kube-discovery is ready after 220.503078 seconds
[addons] Created essential addon: kube-proxy
[addons] Created essential addon: kube-dns

Your Kubernetes master has initialized successfully!

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:

kubeadm join --token=3c43f1.9a42d02deda012ef 192.168.11.74

3.1.3.1 验证初始化

kubeadm join –token=3c43f1.9a42d02deda012ef 192.168.11.74初始化成功后,检查Kubernetes的核心组件均正常启动。
一种方式通过进程方式启动的,一种通过容器方式启动的。

进程方式启动:

#ps -ef|grep kube
root      1324  1308  0 Mar31 ?        00:00:46 /opt/bin/flanneld --ip-masq --kube-subnet-mgr
root      1375  1359  0 Mar31 ?        00:00:00 /bin/sh -c set -e -x; cp -f /etc/kube-flannel/cni-conf.json /etc/cni/net.d/10-flannel.conf; while true; do sleep 3600; done
root      1767  1752  0 Mar31 ?        00:01:16 /kube-dns --domain=cluster.local --dns-port=10053 --config-map=kube-dns --v=2
root      1907  1890  0 Mar31 ?        00:01:03 /exechealthz --cmd=nslookup kubernetes.default.svc.cluster.local 127.0.0.1 >/dev/null --url=/healthz-dnsmasq --cmd=nslookup kubernetes.default.svc.cluster.local 127.0.0.1:10053 >/dev/null --url=/healthz-kubedns --port=8080 --quiet
root      4869     1  2 Mar31 ?        00:37:55 /usr/bin/kubelet --kubeconfig=/etc/kubernetes/kubelet.conf --require-kubeconfig=true --pod-manifest-path=/etc/kubernetes/manifests --allow-privileged=true --network-plugin=cni --cni-conf-dir=/etc/cni/net.d --cni-bin-dir=/opt/cni/bin --cluster-dns=10.96.0.10 --cluster-domain=cluster.local
root      5150  5135  0 Mar31 ?        00:09:49 kube-apiserver --insecure-bind-address=127.0.0.1 --admission-control=NamespaceLifecycle,LimitRanger,ServiceAccount,PersistentVolumeLabel,DefaultStorageClass,ResourceQuota --service-cluster-ip-range=10.96.0.0/12 --service-account-key-file=/etc/kubernetes/pki/apiserver-key.pem --client-ca-file=/etc/kubernetes/pki/ca.pem --tls-cert-file=/etc/kubernetes/pki/apiserver.pem --tls-private-key-file=/etc/kubernetes/pki/apiserver-key.pem --token-auth-file=/etc/kubernetes/pki/tokens.csv --secure-port=6443 --allow-privileged --advertise-address=192.168.111.74 --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --anonymous-auth=false --etcd-servers=http://127.0.0.1:2379
root      5364  5349  0 Mar31 ?        00:00:00 /usr/local/bin/kube-discovery
root      5469  5454  0 Mar31 ?        00:01:58 kube-proxy --kubeconfig=/run/kubeconfig
root      7392  7377  0 03:26 ?        00:01:38 kube-controller-manager --address=127.0.0.1 --leader-elect --master=127.0.0.1:8080 --cluster-name=kubernetes --root-ca-file=/etc/kubernetes/pki/ca.pem --service-account-private-key-file=/etc/kubernetes/pki/apiserver-key.pem --cluster-signing-cert-file=/etc/kubernetes/pki/ca.pem --cluster-signing-key-file=/etc/kubernetes/pki/ca-key.pem --insecure-experimental-approve-all-kubelet-csrs-for-group=system:kubelet-bootstrap --allocate-node-cidrs=true --cluster-cidr=10.244.0.0/16
root      7414  7397  0 03:26 ?        00:00:11 kube-scheduler --address=127.0.0.1 --leader-elect --master=127.0.0.1:8080
root     24542 24290  0 06:12 pts/0    00:00:00 grep --color=auto kube

以容器方式启动的各个组件

296c04fe13e2        gcr.io/google_containers/etcd-amd64:3.0.14-kubeadm              "etcd --listen-client"   2 hours ago         Up 2 hours                              k8s_etcd.c323986f_etcd-luyun-ubuntu1604-1_kube-system_3a26566bb004c61cd05382212e3f978f_ae83a29b
d0716998ed9c        gcr.io/google_containers/kube-scheduler-amd64:v1.5.5            "kube-scheduler --add"   2 hours ago         Up 2 hours                              k8s_kube-scheduler.1effd754_kube-scheduler-luyun-ubuntu1604-1_kube-system_3b5b3d1d0ac46813935348ff689f3682_014091fb
8e209d248f44        gcr.io/google_containers/kube-controller-manager-amd64:v1.5.5   "kube-controller-mana"   2 hours ago         Up 2 hours                              k8s_kube-controller-manager.a14db2e9_kube-controller-manager-luyun-ubuntu1604-1_kube-system_dfaeb92756800dbc0ecd2345b9739eda_35ef6a2f
f76220ab3e97        nginx:1.10.1                                                    "nginx -g 'daemon off"   21 hours ago        Up 21 hours                             k8s_my-nginx.7f88336e_my-nginx-1948696469-5j3cx_default_78b9446c-15f1-11e7-9ca7-fa163eeee269_49d49f85
39e104c340de        gcr.io/google_containers/pause-amd64:3.0                        "/pause"                 21 hours ago        Up 21 hours                             k8s_POD.d8dbe16c_my-nginx-1948696469-5j3cx_default_78b9446c-15f1-11e7-9ca7-fa163eeee269_2aab9aee
a7f4654ca5a3        gcr.io/google_containers/exechealthz-amd64:1.2                  "/exechealthz '--cmd="   21 hours ago        Up 21 hours                             k8s_healthz.81b93f43_kube-dns-2924299975-59nln_kube-system_6411f13b-15ee-11e7-9ca7-fa163eeee269_6ebbcad4
d402450ac7d7        gcr.io/google_containers/dnsmasq-metrics-amd64:1.0              "/dnsmasq-metrics --v"   21 hours ago        Up 21 hours                             k8s_dnsmasq-metrics.e7b55ee6_kube-dns-2924299975-59nln_kube-system_6411f13b-15ee-11e7-9ca7-fa163eeee269_cffd3cf9
30ab13faadc4        gcr.io/google_containers/kube-dnsmasq-amd64:1.4                 "/usr/sbin/dnsmasq --"   21 hours ago        Up 21 hours                             k8s_dnsmasq.bf9489f0_kube-dns-2924299975-59nln_kube-system_6411f13b-15ee-11e7-9ca7-fa163eeee269_e18d2ff0
7123ee1e3574        gcr.io/google_containers/kubedns-amd64:1.9                      "/kube-dns --domain=c"   21 hours ago        Up 21 hours                             k8s_kube-dns.d3da1fe_kube-dns-2924299975-59nln_kube-system_6411f13b-15ee-11e7-9ca7-fa163eeee269_f98f846e
a4f49289d892        gcr.io/google_containers/pause-amd64:3.0                        "/pause"                 21 hours ago        Up 21 hours                             k8s_POD.d8dbe16c_kube-dns-2924299975-59nln_kube-system_6411f13b-15ee-11e7-9ca7-fa163eeee269_cf0167a8
...
...

不过这些核心组件并不是跑在pod network中的(没错,此时的pod network还没有创建),而是采用了host network。

# kubectl get pod  --all-namespaces -o wide
kube-system   dummy-2088944543-zs5xs                       1/1       Running   0          21h       192.168.11.74   ubuntu-01
kube-system   ubuntu-01                      1/1       Running   4          21h       192.168.11.74   ubuntu-01
kube-system   kube-apiserver-ubuntu-01            1/1       Running   0          21h       192.168.11.74   ubuntu-01
kube-system   kube-controller-manager-ubuntu-01   1/1       Running   1          21h       192.168.11.74   ubuntu-01
kube-system   kube-discovery-1769846148-sdx9n              1/1       Running   0          21h       192.168.11.74   ubuntu-01
kube-system   kube-dns-2924299975-59nln                    0/4       ContainerCreating   0          21h       10.244.0.4       ubuntu-01
kube-system   kube-proxy-409dv                             1/1       Running   0          21h       192.168.11.74   ubuntu-01
kube-system   kube-scheduler-ubuntu-01-1            1/1       Running   1          21h       192.168.111.74   ubuntu-01

3.1.4 安装flannel pod网络

初始化集群后,查看一下组件状态,会发现异常
通过命令kubectl get pod –all-namespaces -o wide,你也会发现kube-dns pod处于ContainerCreating状态。查看dns日志会发现一些错误的信息:

  FirstSeen    LastSeen    Count    From                SubObjectPath    Type        Reason        Message
  ---------    --------    -----    ----                -------------    --------    ------        -------
  22s        22s        1    {default-scheduler }                Normal        Scheduled    Successfully assigned kube-dns-2924299975-0h6kt to ubuntu-01
  16s        9s        2    {kubelet ubuntu-01}            Warning        FailedSync    Error syncing pod, skipping: failed to "SetupNetwork" for "kube-dns-2924299975-0h6kt_kube-system" with SetupNetworkError: "Failed to setup network for pod \"kube-dns-2924299975-0h6kt_kube-system(725cc36f-14ec-11e7-bf45-fa163eeee269)\" using network plugins \"cni\": open /run/flannel/subnet.env: no such file or directory; Skipping pod"

这种错误是由于没有装网络组件造成的,所以我们要安装网络组件。

Kubernetes一共提供五种网络组件,可以根据自己的需要选择。我使用的Flannel网络,需要执行如下安装命令:

kubectl apply -f  https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
serviceaccount "flannel" created
configmap "kube-flannel-cfg" created
daemonset "kube-flannel-ds" created

也可以将flannel从git上下载到本地。执行安装命令:

kubectl apply -f  /root/flannel/Documentation/kube-flannel.yml

安装flannel需要下载flannel镜像,安装过程需要一定的时间。
稍等片刻,我们再来看master node上的cluster信息:

# ps aux|grep kube|grep flannel
root      1324  0.0  0.8 277860 33880 ?        Ssl  Mar31   0:47 /opt/bin/flanneld --ip-masq --kube-subnet-mgr
root      1375  0.0  0.0   8096  2084 ?        Ss   Mar31   0:00 /bin/sh -c set -e -x; cp -f /etc/kube-flannel/cni-conf.json /etc/cni/net.d/10-flannel.conf; while true; do sleep 3600; done

检查各节点组件运行状态,集群的核心组件已经全部run起来了:

kube-system   dummy-2088944543-zs5xs                       1/1       Running   0          21h       192.168.11.74   ubuntu-01
kube-system   ubuntu-01                      1/1       Running   4          21h       192.168.11.74   ubuntu-01
kube-system   kube-apiserver-ubuntu-01            1/1       Running   0          21h       192.168.11.74   ubuntu-01
kube-system   kube-controller-manager-ubuntu-01   1/1       Running   1          21h       192.168.11.74   ubuntu-01
kube-system   kube-discovery-1769846148-sdx9n              1/1       Running   0          21h       192.168.11.74   ubuntu-01
kube-system   kube-dns-2924299975-59nln                    4/4       Running   0          21h       10.244.0.4       ubuntu-01
kube-system   kube-proxy-409dv                             1/1       Running   0          21h       192.168.11.74   ubuntu-01
kube-system   kube-scheduler-ubuntu-01-1            1/1       Running   1          21h       192.168.111.74   ubuntu-01

测试DNS

  • 创建检测DNS pod
# kubectl run curl --image=radial/busyboxplus:curl -i --tty
Waiting for pod default/curl-2421989462-3xx4j to be running, status is Pending, pod ready: false
Waiting for pod default/curl-2421989462-3xx4j to be running, status is Pending, pod ready: false
Waiting for pod default/curl-2421989462-3xx4j to be running, status is Pending, pod ready: false
Waiting for pod default/curl-2421989462-3xx4j to be running, status is Pending, pod ready: false
  • 进入后执行nslookup kubernetes.default确认解析正常。
[ root@curl-2421989462-3xx4j:/ ]$ nslookup kubernetes.default
Server:    10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local

Name:      kubernetes.default
Address 1: 10.96.0.1 kubernetes.default.svc.cluster.local
  • 测试OK后,删除掉curl这个Pod。
# kubectl delete deploy curl

到这一步就可以向集群中发布微服务了,同时可以使用kubeadm join命令添加新的Node到集群中

3.1.6 部署node节点

将node加入cluster了。这里使用:kubeadm join。在执行此命令时需要执行3.1.1步骤的命令。

在node上执行(注意:这里要保证token是正确的从init的日志里可以获取到,),根据Master上初始化成功后会打印的token:

# kubeadm join --token=3c43f1.9a42d02deda012ef 192.168.11.74

Node join complete:
* Certificate signing request sent to master and response
  received.
* Kubelet informed of new secure connection details.

3.1.6.1 验证node组件情况

在node上看到的k8s组件情况如下:

# docker ps
5cb97385e37        quay.io/coreos/flannel:v0.7.0-amd64                "/opt/bin/flanneld --"   21 hours ago        Up 21 hours                             k8s_kube-flannel.e9308be1_kube-flannel-ds-q45x4_default_8f3335ab-15f0-11e7-9ca7-fa163eeee269_78864901
3b88c81c5b3b        gcr.io/google_containers/kube-proxy-amd64:v1.5.5   "kube-proxy --kubecon"   21 hours ago        Up 21 hours                             k8s_kube-proxy.18cab4d8_kube-proxy-7c99k_kube-system_8f32be43-15f0-11e7-9ca7-fa163eeee269_28972d3e
267e30837061        quay.io/coreos/flannel:v0.7.0-amd64                "/bin/sh -c 'set -e -"   21 hours ago        Up 21 hours                             k8s_install-cni.efd78816_kube-flannel-ds-q45x4_default_8f3335ab-15f0-11e7-9ca7-fa163eeee269_2bde126b
bdae2b7908da        gcr.io/google_containers/pause-amd64:3.0           "/pause"                 21 hours ago        Up 21 hours                             k8s_POD.d8dbe16c_kube-proxy-7c99k_kube-system_8f32be43-15f0-11e7-9ca7-fa163eeee269_085249bc
9a627d637c6d        gcr.io/google_containers/pause-amd64:3.0           "/pause"                 21 hours ago        Up 21 hours                             k8s_POD.d8dbe16c_kube-flannel-ds-q45x4_default_8f3335ab-15f0-11e7-9ca7-fa163eeee269_9968e26c

3.1.7 验证集群状态

现在集群搭建完成了,验证集群状态,在master node上查看当前cluster状态:

# kubectl get nodes
NAME                 STATUS         AGE
ubuntu01   Ready,master   22h
ubuntu02   Ready          22h

出现以上状态,表面础环境就搭好了,可以后续继续验证是否真正成功,可以尝试部署服务等

3.1.8 部署微服务(可选)

上面步骤已经部署完成了一套kubernetes环境,下面部署一个官方提供的电商微服务应用。

# kubectl create namespace sock-shop  
# kubectl apply -n sock-shop -f "https://github.com/microservices-demo/microservices-demo/blob/master/deploy/kubernetes/complete-demo.yaml?raw=true"

然后查看分配给样例应用的服务信息:

# kubectl describe svc front-end -n sock-shop
Name:           front-end
Namespace:      sock-shop
Labels:         name=front-end
Selector:       name=front-end
Type:           NodePort
IP:         10.97.162.95
Port:           <unset> 80/TCP
NodePort:       <unset> 30001/TCP
Endpoints:      10.244.1.7:8079
Session Affinity:   None
No events.

经过几分钟,会下载所需镜像病启动样例应用所需容器,然后就可以通过命令kubectl get pods -n sock-shop的输出查看样例应用POD详细信息

# kubectl get pods -n sock-shop
NAME                            READY     STATUS    RESTARTS   AGE
carts-2925342755-hvwcc          1/1       Running   0          22h
carts-db-2797325130-vst02       1/1       Running   0          22h
catalogue-1279937814-tplnb      1/1       Running   0          22h
catalogue-db-2290683463-6bf7p   1/1       Running   0          22h
front-end-48666118-gk1qc        1/1       Running   0          22h
orders-2584752504-9qkm9         1/1       Running   0          22h
orders-db-3277638702-stcmc      1/1       Running   0          22h
payment-2411285232-zhq9v        1/1       Running   0          22h
queue-master-1271843919-wn0d5   1/1       Running   0          22h
rabbitmq-3472039365-5gftt       1/1       Running   0          22h
shipping-3204723698-jznnj       1/1       Running   0          22h
user-619013510-jgt9h            1/1       Running   0          22h
user-db-431019311-30nl4         1/1       Running   0          22h

进入到Kubernetes集群的master节点上,通过浏览器访问http://:。在上面这个例子中,端口是30001,这个端口可以通过命令kubectl describe查询出来。
访问http://:会出现以下页面:
这里写图片描述

如果有防火墙,那么确保这个端口可以被访问到。

3.1.9 将maste节点设为可调度的节点(可选)

Kubeadm默认安装时,master node将不会参与Pod调度,不会承载work load,即不会有非核心组件的Pod在Master node上被创建出来。当然通过kubectl taint命令可以解除这一限制

#kubectl taint nodes ubuntu-01 dedicated-
 node "ubuntu-01" tainted

3.2.0 不在master节点上操作集群,而是在其他工作节点上操作集群(可选)

需要将master节点上面的kubernetes配置文件拷贝到当前节点上,然后执行kubectl命令:

# scp root@<master ip>:/etc/kubernetes/admin.conf .  

# kubectl --kubeconfig ./admin.conf get nodes

3.2.1 卸载(可选)

参照问题总结的2和3.

四.安装问题总结: ###

  1. 由于使用kubeadm安装的kubernetes核心组件都是以docker容器的形式运行,如果安装过程出现问题,需要先执行下面的命令清理之前的执行残留后,才能重新开始。
  2. 如果需要重新部署删除node节点需要执行一下命令:
# kubectl drain <node name> --delete-local-data --force --ignore-daemonsets
# kubectl delete node <node name>

3 kubeadm会自动检查当前环境是否有上次命令执行的“残留”。如果有,必须清理后再行执行init。我们可以通过”kubeadm reset”来清理环境,以备重来。

# kubeadm reset
[preflight] Running pre-flight checks
[reset] Stopping the kubelet service
[reset] Unmounting mounted directories in "/var/lib/kubelet"
[reset] Removing kubernetes-managed containers
[reset] Deleting contents of stateful directories: [/var/lib/kubelet /etc/cni/net.d /var/lib/etcd]
[reset] Deleting contents of config directories: [/etc/kubernetes/manifests /etc/kubernetes/pki]
[reset] Deleting files: [/etc/kubernetes/admin.conf /etc/kubernetes/kubelet.conf]

4 初始化集群如果想要指定kubernetes版本,可使用一下指令:(,如果不指定使用最新版本)

 kubeadm init --use-kubernetes-version=v1.5.5 --pod-network-cidr=10.244.0.0/16

5 如果想要查看容器详情可以通过。可使用如下指令:

$ kubectl describe 指令
$ kubectl logs 指令

参考文档:
Installing Kubernetes on Linux with kubeadm主要参照这篇官方文档。
https://www.hi-linux.com/posts/64604.html

http://blog.frognew.com/2017/01/install-kubernetes-with-kubeadm.html

https://mritd.me/2016/10/29/set-up-kubernetes-cluster-by-kubeadm/#34%E5%88%9D%E5%A7%8B%E5%8C%96-master

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐