众所周知,kubernetes(简称k8s)是用于管理docker集群的,最近一段时间一直在折腾环境问题,在此写一篇博客,来帮助像我一样的小白,避免走弯路。

一、环境

集群环境

角色

IP地址

版本号

Docker版本

系统版本

master

192.63.63.1/24

v1.9.1

17.12.0-ce

Centos7.1

node1

192.63.63.10/24

v1.9.1

17.12.0-ce

Centos7.1

node2

192.63.63.20/24

v1.9.1

17.12.0-ce

Centos7.1

Master节点必需组件

组件名称

作用

版本号

etcd

非关系型数据库

v1.9.1

kube-apiserver

核心组件,所有组件均与其通信,提供Http Restful接口

v1.9.1

kube-controller-manager

集群内部管理中心,负责各类资源管理,如RCPod,命名空间等

v1.9.1

kube-scheduler

调度组件,负责node的调度

v1.9.1

 Node节点必需组件

组件名称

作用

版本号

kubelet

Node节点中核心组件,负责执行Master下发的任务

v1.9.1

kube-proxy

代理,负责kubeletapiserver网络。相当于负载均衡,将请求转到后端pod中

v1.9.1

 二、安装

  在看《Kubernetes权威指南》通过yum install方式安装。截止目前(2018-02-27)通过yum安装的版本是1.5.2,而最新版本是1.9.1。两个版本之间差异还是比较大,主要差异kubelet配置文件中不在支持api-server参数

虽然yum安装的不是最新版本,但是我们还是可以借鉴一些内容,例如systemd脚本服务,k8s各个配置文件。

2.0 安装etcd

上面介绍了etcd是数据库,用于存储k8s相关数据。etcd并不属于k8s组件,因此需要单独安装一下,安装很方便,通过yum安装即可。目前yum安装的最新版本是3.2.11。

[html]  view plain  copy
  1. [root@localhost ~]# yum install etcd  

2.1 下载并安装

最新版本下载地址,只需下载Server Binaries。因为node节点必需的组件,也包含在这个Server Binaries中。下载完毕后,进行解压并把可执行文件拷贝到系统目录中

[html]  view plain  copy
  1. [root@localhost packet]#  
  2. [root@localhost packet]# tar -zxf kubernetes-server-linux-amd64.tar.gz  
  3. [root@localhost packet]# ls  
  4. kubernetes kubernetes-server-linux-amd64.tar.gz  opensrc  
  5. [root@localhost packet]#  
  6. [root@localhost packet]# cd kubernetes/server/bin  
  7. [root@localhost bin]# cp apiextensions-apiserver cloud-controller-manager  hyperkube    kubeadm kube-aggregator kube-apiserver kube-controller-manager kubectl kubelet kube-proxy  kube-scheduler  mounter /usr/bin  
  8. [root@localhost bin]#  

2.2 配置systemd服务

  下面这些文件均来自kubernetes1.5.2 rpm包,存放目录为/usr/lib/systemd/system

[html]  view plain  copy
  1. [root@localhost system]# cat kube-apiserver.service  
  2. [Unit]  
  3. Description=Kubernetes API Server  
  4. Documentation=https://github.com/GoogleCloudPlatform/kubernetes  
  5. After=network.target  
  6. After=etcd.service  
  7.   
  8. [Service]  
  9. EnvironmentFile=-/etc/kubernetes/config  
  10. EnvironmentFile=-/etc/kubernetes/apiserver  
  11. User=kube  
  12. ExecStart=/usr/bin/kube-apiserver \  
  13.             $KUBE_LOGTOSTDERR \  
  14.             $KUBE_LOG_LEVEL \  
  15.             $KUBE_ETCD_SERVERS \  
  16.             $KUBE_API_ADDRESS \  
  17.             $KUBE_API_PORT \  
  18.             $KUBELET_PORT \  
  19.             $KUBE_ALLOW_PRIV \  
  20.             $KUBE_SERVICE_ADDRESSES \  
  21.             $KUBE_ADMISSION_CONTROL \  
  22.             $KUBE_API_ARGS  
  23. Restart=on-failure  
  24. Type=notify  
  25. LimitNOFILE=65536  
  26.   
  27. [Install]  
  28. WantedBy=multi-user.target  
  29.   
  30. [root@localhost system]#  
  31. [root@localhost system]# cat  kube-controller-manager.service  
  32. [Unit]  
  33. Description=Kubernetes Controller Manager  
  34. Documentation=https://github.com/GoogleCloudPlatform/kubernetes  
  35.    
  36. [Service]  
  37. EnvironmentFile=-/etc/kubernetes/config  
  38. EnvironmentFile=-/etc/kubernetes/controller-manager  
  39. User=kube  
  40. ExecStart=/usr/bin/kube-controller-manager \  
  41.             $KUBE_LOGTOSTDERR \  
  42.             $KUBE_LOG_LEVEL \  
  43.             $KUBE_MASTER \  
  44.             $KUBE_CONTROLLER_MANAGER_ARGS  
  45. Restart=on-failure  
  46. LimitNOFILE=65536  
  47.   
  48. [Install]  
  49. WantedBy=multi-user.target  
  50. [root@localhost system]#  
  51. [root@localhost system]#  
  52. [root@localhost system]# cat  kubelet.service  
  53. [Unit]  
  54. Description=Kubernetes Kubelet Server  
  55. Documentation=https://github.com/GoogleCloudPlatform/kubernetes  
  56. After=docker.service  
  57. Requires=docker.service  
  58.   
  59. [Service]  
  60. WorkingDirectory=/var/lib/kubelet  
  61. EnvironmentFile=-/etc/kubernetes/config  
  62. EnvironmentFile=-/etc/kubernetes/kubelet  
  63. ExecStart=/usr/bin/kubelet \  
  64.             $KUBE_LOGTOSTDERR \  
  65.             $KUBE_LOG_LEVEL \  
  66.             $KUBELET_API_SERVER \  
  67.             $KUBELET_ADDRESS \  
  68.             $KUBELET_PORT \  
  69.             $KUBELET_HOSTNAME \  
  70.             $KUBE_ALLOW_PRIV \  
  71.             $KUBELET_ARGS  
  72. Restart=on-failure  
  73. KillMode=process  
  74.    
  75. [Install]  
  76. WantedBy=multi-user.target  
  77. [root@localhost system]#  
  78. [root@localhost system]#  
  79. [root@localhost system]# cat kube-proxy.service  
  80. [Unit]  
  81. Description=Kubernetes Kube-Proxy Server  
  82. Documentation=https://github.com/GoogleCloudPlatform/kubernetes  
  83. After=network.target  
  84.    
  85. [Service]  
  86. EnvironmentFile=-/etc/kubernetes/config  
  87. EnvironmentFile=-/etc/kubernetes/proxy  
  88. ExecStart=/usr/bin/kube-proxy \  
  89.             $KUBE_LOGTOSTDERR \  
  90.             $KUBE_LOG_LEVEL \  
  91.             $KUBE_MASTER \  
  92.             $KUBE_PROXY_ARGS  
  93. Restart=on-failure  
  94. LimitNOFILE=65536  
  95.    
  96. [Install]  
  97. WantedBy=multi-user.target  
  98. [root@localhost system]#  
  99. [root@localhost system]#  
  100. [root@localhost system]# cat  kube-scheduler.service  
  101. [Unit]  
  102. Description=Kubernetes Scheduler Plugin  
  103. Documentation=https://github.com/GoogleCloudPlatform/kubernetes  
  104.   
  105. [Service]  
  106. EnvironmentFile=-/etc/kubernetes/config  
  107. EnvironmentFile=-/etc/kubernetes/scheduler  
  108. User=kube  
  109. ExecStart=/usr/bin/kube-scheduler \  
  110.             $KUBE_LOGTOSTDERR \  
  111.             $KUBE_LOG_LEVEL \  
  112.             $KUBE_MASTER \  
  113.             $KUBE_SCHEDULER_ARGS  
  114. Restart=on-failure  
  115. LimitNOFILE=65536  
  116.   
  117. [Install]  
  118. WantedBy=multi-user.target  
  119. [root@localhost system]#  

2.3 配置k8s

  通过systemd服务配置文件可知需创建/etc/kubernetes目录以及相关文件

[html]  view plain  copy
  1. [root@localhost kubernetes]# ls  
  2. apiserver  config  controller-manager  kubelet  proxy  scheduler  
  3. [root@localhost kubernetes]#  
  4. [root@localhost kubernetes]# cat config  
  5. ###  
  6. # kubernetes system config  
  7. #  
  8. # The following values are used to configure various aspects of all  
  9. # kubernetes services, including  
  10. #  
  11. #   kube-apiserver.service  
  12. #   kube-controller-manager.service  
  13. #   kube-scheduler.service  
  14. #   kubelet.service  
  15. #   kube-proxy.service  
  16. # logging to stderr means we get it in the systemd journal  
  17. KUBE_LOGTOSTDERR="--logtostderr=true"  
  18.   
  19. # journal message level, 0 is debug  
  20. KUBE_LOG_LEVEL="--v=0"  
  21.   
  22. # Should this cluster be allowed to run privileged docker containers  
  23. KUBE_ALLOW_PRIV="--allow-privileged=false"  
  24.   
  25. # How the controller-manager, scheduler, and proxy find the apiserver  
  26. KUBE_MASTER="--master=http://127.0.0.1:8080"  
  27. [root@localhost kubernetes]#  

    Apiserver需要将--insecure-bind-address地址修改为0.0.0.0(修改为大网ip地址),接收任意地址的连接。

[html]  view plain  copy
  1. [root@localhost kubernetes]# cat apiserver  
  2. ###  
  3. # kubernetes system config  
  4. #  
  5. # The following values are used to configure the kube-apiserver  
  6. #  
  7. # The address on the local server to listen to.  
  8. KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"  
  9.   
  10. # The port on the local server to listen on.  
  11. KUBE_API_PORT="--port=8080"  
  12.   
  13. # Port minions listen on  
  14. KUBELET_PORT="--kubelet-port=10250"  
  15.   
  16. # Comma separated list of nodes in the etcd cluster  
  17. KUBE_ETCD_SERVERS="--etcd-servers=http://127.0.0.1:2379"  
  18.   
  19. # Address range to use for services  
  20. KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"  
  21.   
  22. # default admission control policies  
  23. #KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota"  
  24. KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"  
  25.   
  26. # Add your own!  
  27. KUBE_API_ARGS=""  
  28. [root@localhost kubernetes]#  

        Kubelet配置文件,最重要的配置是执行apiserver所在的地址,但是在v1.8版本之后不再支持--api-servers,因此需要注释掉,那么问题来了,kubelet是如何指定api-server地址呢?

 

[html]  view plain  copy
  1. [root@localhost kubernetes]# cat kubelet  
  2. ###  
  3. # kubernetes kubelet (minion) config  
  4.   
  5. # The address for the info server to serve on (set to 0.0.0.0 or "" for all interfaces)  
  6. KUBELET_ADDRESS="--address=127.0.0.1"  
  7.   
  8. # The port for the info server to serve on  
  9. KUBELET_PORT="--port=10250"  
  10.    
  11. # You may leave this blank to use the actual hostname  
  12. KUBELET_HOSTNAME="--hostname-override=127.0.0.1"  
  13.    
  14. # location of the api-server  
  15. ##KUBELET_API_SERVER="--api-servers=http://127.0.0.1:8080"  
  16.   
  17. # pod infrastructure container  
  18. KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=docker.io/kubernetes/pause"  
  19.   
  20. # Add your own!  
  21. KUBELET_ARGS="--fail-swap-on=false --cgroup-driver=cgroupfs --kubeconfig=/var/lib/kubelet/kubeconfig"  

    下面几个配置文件内容基本是空,没有什么内容。

[html]  view plain  copy
  1. [root@localhost kubernetes]# cat controller-manager  
  2. ###  
  3. # The following values are used to configure the kubernetes controller-manager  
  4.   
  5. # defaults from config and apiserver should be adequate  
  6.   
  7. # Add your own!  
  8. KUBE_CONTROLLER_MANAGER_ARGS=""  
  9. [root@localhost kubernetes]#  
  10. [root@localhost kubernetes]# cat proxy  
  11. ###  
  12. # kubernetes proxy config  
  13.   
  14. # default config should be adequate  
  15.   
  16. # Add your own!  
  17. KUBE_PROXY_ARGS=""  
  18. [root@localhost kubernetes]#  
  19. [root@localhost kubernetes]# cat  scheduler  
  20. ###  
  21. # kubernetes scheduler config  
  22.    
  23. # default config should be adequate  
  24.   
  25. # Add your own!  
  26. KUBE_SCHEDULER_ARGS="--loglevel=0"  

  以上配置均是在master节点中进行配置,配置完成后这样k8s就是一个单节点集群--既运行master也运行node的环境。只不过node还有问题,下面介绍。

三、http方式

  前面已经介绍过,在v1.8版本之后kubelet不再支持api-server参数,那么在新版本kubelet如何才能与api-server进行通信呢?是通过kubeconfig参数,指定配置文件(这个地方是一个大坑,坑了我好长一段时间)

  在/etc/kubernetes/kubelet配置文件中有一个配置项,

KUBELET_ARGS="--fail-swap-on=false --cgroup-driver=cgroupfs --kubeconfig=/var/lib/kubelet/kubeconfig"

  指定kubeconfig所在的目录,内容如下:

[html]  view plain  copy
  1. [root@localhost kubernetes]#  
  2. [root@localhost kubernetes]# cat /var/lib/kubelet/kubeconfig  
  3. apiVersion: v1  
  4. clusters:  
  5. - cluster:  
  6.     server: http://127.0.0.1:8080  
  7.   name: myk8s  
  8. contexts:  
  9. - context:  
  10.     cluster: myk8s  
  11.     user: ""  
  12.   name: myk8s-context  
  13. current-context: myk8s-context  
  14. kind: Config  
  15. preferences: {}  
  16. users: []  
  17. [root@localhost kubernetes]#  

    解释一下上面内容:

    1) clusters - 代表集群,支持多个集群。里面需要制定server,即api-server所在地址。此处也支持https方式,后面详细介绍。

    2) contexts - 集群上下文,支持多个上下文

    3) current-context - 表示当前使用的上下文

 其他字段在介绍https方式时在进行说明。

至此,单节点集群部署完成,我们需要启动各个服务。

[html]  view plain  copy
  1. [root@localhost k8s]# systemctl start docker  
  2. [root@localhost k8s]# systemctl start etcd  
  3. [root@localhost k8s]# systemctl start kube-apiserver  
  4. [root@localhost k8s]# systemctl start kube-controller-manager  
  5. [root@localhost k8s]# systemctl start kube-scheduler  
  6. [root@localhost k8s]# systemctl start kubelet  
  7. [root@localhost k8s]# systemctl start kube-proxy  
  8. [root@localhost k8s]#  

验证环境是否正常:

[html]  view plain  copy
  1. [root@localhost k8s]#  
  2. [root@localhost k8s]# kubectl get nodes  
  3. NAME        STATUS    ROLES     AGE       VERSION  
  4. 127.0.0.1   Ready     <none>    16d       v1.9.1  
  5. [root@localhost k8s]#  
  6. [root@localhost k8s]#  

以上内容只是master节点上配置,下面我们在node1中配置http方式访问api-server

    首先需要将kubeletkube-proxy进程以及先关配置文件拷贝到node1中,然后把可执行程序以及配置文件拷贝到对应目录中:

[html]  view plain  copy
  1. [root@node1 k8s_node]#  
  2. [root@node1 k8s_node]# ls bin-file/ config-file/  
  3. bin-file/:  
  4. kubelet  kube-proxy  
  5. config-file/:  
  6. config  kubeconfig  kubelet  kubelet.service  kube-proxy.service  proxy  
  7. [root@node1 k8s_node]#  
  8. [root@node1 k8s_node]#  
  9. [root@node1 k8s_node]# mv bin-file/kubelet bin-file/kube-proxy /usr/bin  
  10. [root@node1 k8s_node]# mkdir /etc/kubernetes  
  11. [root@node1 k8s_node]# mv config-file/config config-file/kubelet config-file/proxy /etc/kubernetes/  
  12. [root@node1 k8s_node]# mv config-file/kubelet.service config-file/kube-proxy.service /usr/lib/systemd/system  
  13. [root@node1 k8s_node]#  
  14. [root@node1 k8s_node]# mkdir /var/lib/kubelet  
  15. [root@node1 k8s_node]# mv config-file/kubeconfig /var/lib/kubelet/  
  16. [root@node1 k8s_node]#  

重点:

1)修改/var/lib/kubelet/kubeconfig文件中serverip地址,修改为http://192.63.63.1:8080

2)修改/etc/kubernetes/kubelet文件中KUBELET_HOSTNAME将其修改为"--hostname-override=node1"

分别启动服务dockerkubeletkube-proxy,然后在master进行验证:

[html]  view plain  copy
  1. [root@localhost ~]#  
  2. [root@localhost ~]# kubectl get nodes  
  3. NAME        STATUS    ROLES     AGE       VERSION  
  4. 127.0.0.1   Ready     <none>    17d       v1.9.1  
  5. node1       Ready     <none>    5m        v1.9.1  
  6. [root@localhost ~]#  

当出现namenode1,且statusReady,则表示部署成功。

至此,k8s部署且http方式介绍完,下一篇介绍https方式

Logo

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

更多推荐