前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >离线环境下使用二进制方式安装配置Kubernetes集群

离线环境下使用二进制方式安装配置Kubernetes集群

作者头像
大江小浪
发布2018-07-24 13:58:15
1.5K1
发布2018-07-24 13:58:15
举报
文章被收录于专栏:小狼的世界

本文环境 Redhat Linux 7.3,操作系统采用的最小安装方式。 Kubernetes的版本为 V1.10。 Docker版本为18.03.1-ce。 etcd 版本为 V3.3.8。

1. 准备规划

1.1 Node 规划

主机名

地址

角色

devops-101

192.168.0.101

k8s master

devops-102

192.168.0.102

k8s node

1.2 Network 网络

1.3 安装文件

Kubernetes安装需要以下二进制文件:

  • etcd
  • docker
  • Kubernetes
    • kubelet
    • kube-proxy
    • kube-apiserver
    • kube-controller-manager
    • kube-scheduler

我们可以下载编译好的二进制文件,也可以下载源码自己编译,源码编译可以参考这里本文只讨论二进制的安装方式。在Kubernetes的Github Latest 页面,可以看到最新打包的版本。也可以到 Tag 页面中找到自己需要的版本,我下载的是 V1.11

注意这个页面有可能不是最新的版本,我查看的时候显示的版本是 V1.9.9,但是最新的版本是 V1.11,这时就需要切换到 Tag 页面查找。

服务器上需要的二进制文件并不在下载的 tar 包中,需要解压tar包,然后执行cluster/get-kube-binaries.sh。下载需要访问 storage.googleapis.com,因为大家都知道的原因,可能无法正常访问,需要大家科学的获取安装文件。下载完成后,解压kubernetes-server-linux-amd64.tar.gz

可以看到文件列表

代码语言:javascript
复制
[root@devops-101 bin]# pwd
/root/kubernetes/server/bin
[root@devops-101 bin]# ls -lh
total 1.8G
-rwxr-xr-x. 1 root root  57M Jun 28 04:55 apiextensions-apiserver
-rwxr-xr-x. 1 root root 132M Jun 28 04:55 cloud-controller-manager
-rw-r--r--. 1 root root    8 Jun 28 04:55 cloud-controller-manager.docker_tag
-rw-r--r--. 1 root root 134M Jun 28 04:55 cloud-controller-manager.tar
-rwxr-xr-x. 1 root root 218M Jun 28 04:55 hyperkube
-rwxr-xr-x. 1 root root  56M Jun 28 04:55 kube-aggregator
-rw-r--r--. 1 root root    8 Jun 28 04:55 kube-aggregator.docker_tag
-rw-r--r--. 1 root root  57M Jun 28 04:55 kube-aggregator.tar
-rwxr-xr-x. 1 root root 177M Jun 28 04:55 kube-apiserver
-rw-r--r--. 1 root root    8 Jun 28 04:55 kube-apiserver.docker_tag
-rw-r--r--. 1 root root 179M Jun 28 04:55 kube-apiserver.tar
-rwxr-xr-x. 1 root root 147M Jun 28 04:55 kube-controller-manager
-rw-r--r--. 1 root root    8 Jun 28 04:55 kube-controller-manager.docker_tag
-rw-r--r--. 1 root root 149M Jun 28 04:55 kube-controller-manager.tar
-rwxr-xr-x. 1 root root  50M Jun 28 04:55 kube-proxy
-rw-r--r--. 1 root root    8 Jun 28 04:55 kube-proxy.docker_tag
-rw-r--r--. 1 root root  96M Jun 28 04:55 kube-proxy.tar
-rwxr-xr-x. 1 root root  54M Jun 28 04:55 kube-scheduler
-rw-r--r--. 1 root root    8 Jun 28 04:55 kube-scheduler.docker_tag
-rw-r--r--. 1 root root  55M Jun 28 04:55 kube-scheduler.tar
-rwxr-xr-x. 1 root root  55M Jun 28 04:55 kubeadm
-rwxr-xr-x. 1 root root  53M Jun 28 04:56 kubectl
-rwxr-xr-x. 1 root root 156M Jun 28 04:55 kubelet
-rwxr-xr-x. 1 root root 2.3M Jun 28 04:55 mounter

1.4 系统配置

  • 配置Hosts
  • 关闭防火墙
代码语言:javascript
复制
$ systemctl stop firewalld
$ systemctl disable firewalld
  • 关闭selinux
代码语言:javascript
复制
$ vim /etc/selinux/config

将SELINUX=enforcing改为SELINUX=disabled,wq保存退出。

  • 关闭swap
代码语言:javascript
复制
$ swapoff -a
$ vim /etc/fstab #修改自动挂载配置,注释掉即可
#/dev/mapper/centos-swap swap   swap    defaults    0 0

2. 安装 Node

我们需要在Node机器上安装以下应用:

  • Docker
  • kubelet
  • kube-proxy

2.1 Docker

Docker的版本需要与kubelete版本相对应,最好都使用最新的版本。Redhat 中需要使用 Static Binary 方式安装,具体可以参考我之前的一篇文章

2.2 拷贝 kubelet、kube-proxy

在之前解压的 kubernetes 文件夹中拷贝二进制文件

代码语言:javascript
复制
$ cp /root/kubernetes/server/bin/kubelet /usr/bin/
$ cp /root/kubernetes/server/bin/kube-proxy /usr/bin/

2.3 安装 kube-proxy 服务

代码语言:javascript
复制
$ vim /usr/lib/systemd/system/kube-proxy.service
[Unit]
Description=Kubernetes Kube-Proxy Server
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=network.target
 
[Service]
EnvironmentFile=/etc/kubernetes/config
EnvironmentFile=/etc/kubernetes/proxy
ExecStart=/usr/bin/kube-proxy \
            $KUBE_LOGTOSTDERR \
            $KUBE_LOG_LEVEL \
            $KUBE_MASTER \
            $KUBE_PROXY_ARGS
Restart=on-failure
LimitNOFILE=65536
 
[Install]
WantedBy=multi-user.target

创建配置目录,并添加配置文件

代码语言:javascript
复制
$ mkdir -p /etc/kubernetes
$ vim /etc/kubernetes/proxy
KUBE_PROXY_ARGS=""
$ vim /etc/kubernetes/config
KUBE_LOGTOSTDERR="--logtostderr=true"
KUBE_LOG_LEVEL="--v=0"
KUBE_ALLOW_PRIV="--allow_privileged=false"
KUBE_MASTER="--master=http://192.168.0.101:8080"

启动服务

代码语言:javascript
复制
[root@devops-102 ~]# systemctl daemon-reload
[root@devops-102 ~]# systemctl start kube-proxy.service
[root@devops-102 ~]# netstat -lntp | grep kube-proxy
tcp        0      0 127.0.0.1:10249         0.0.0.0:*               LISTEN      10522/kube-proxy    
tcp6       0      0 :::10256                :::*                    LISTEN      10522/kube-proxy  

2.4 安装 kubelete 服务

代码语言:javascript
复制
$ vim /usr/lib/systemd/system/kubelet.service
[Unit]
Description=Kubernetes Kubelet Server
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=docker.service
Requires=docker.service
 
[Service]
WorkingDirectory=/var/lib/kubelet
EnvironmentFile=/etc/kubernetes/kubelet
ExecStart=/usr/bin/kubelet $KUBELET_ARGS
Restart=on-failure
KillMode=process
 
[Install]
WantedBy=multi-user.target
$ mkdir -p /var/lib/kubelet
$ vim /etc/kubernetes/kubelet
KUBELET_ADDRESS="--address=0.0.0.0"
KUBELET_HOSTNAME="--hostname-override=192.168.0.102"
KUBELET_API_SERVER="--api-servers=http://192.168.0.101:8080"
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=reg.docker.tb/harbor/pod-infrastructure:latest"
KUBELET_ARGS="--enable-server=true --enable-debugging-handlers=true --fail-swap-on=false --kubeconfig=/var/lib/kubelet/kubeconfig"

创建配置文件 vim /var/lib/kubelet/kubeconfig

代码语言:javascript
复制
apiVersion: v1
kind: Config
users:
- name: kubelet
clusters:
- name: kubernetes
  cluster:
    server: http://192.168.0.101:8080
contexts:
- context:
    cluster: kubernetes
    user: kubelet
  name: service-account-context
current-context: service-account-context

启动kubelet并进习验证。

代码语言:javascript
复制
$ swapoff -a
$ systemctl daemon-reload
$ systemctl start kubelet.service
$ netstat -tnlp | grep kubelet
tcp        0      0 127.0.0.1:10248         0.0.0.0:*               LISTEN      10630/kubelet       
tcp        0      0 127.0.0.1:37865         0.0.0.0:*               LISTEN      10630/kubelet       
tcp6       0      0 :::10250                :::*                    LISTEN      10630/kubelet       
tcp6       0      0 :::10255                :::*                    LISTEN      10630/kubelet

3. 安装 Master

3.1 安装etcd

本文采用二进制安装方法,首先下载安装包。

之后进行解压,文件拷贝,编辑 etcd.service、etcd.conf文件夹

代码语言:javascript
复制
$ tar zxf etcd-v3.2.11-linux-amd64.tar.gz
$ cd etcd-v3.2.11-linux-amd64
$ cp etcd etcdctl /usr/bin/
$ vim /usr/lib/systemd/system/etcd.service
[Unit]
Description=etcd.service
 
[Service]
Type=notify
TimeoutStartSec=0
Restart=always
WorkingDirectory=/var/lib/etcd
EnvironmentFile=-/etc/etcd/etcd.conf
ExecStart=/usr/bin/etcd
 
[Install]
WantedBy=multi-user.target
$ mkdir -p /var/lib/etcd && mkdir -p /etc/etcd/
$ vim /etc/etcd/etcd.conf
ETCD_NAME=ETCD Server
ETCD_DATA_DIR="/var/lib/etcd/"
ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.0.101:2379"
# 启动etcd
$ systemctl daemon-reload
$ systemctl start etcd.service

查看etcd状态是否正常

代码语言:javascript
复制
$ etcdctl cluster-health
member 8e9e05c52164694d is healthy: got healthy result from http://192.168.0.101:2379
cluster is healthy

3.2 安装kube-apiserver

添加启动文件

代码语言:javascript
复制
[Unit]
Description=Kubernetes API Server
After=etcd.service
Wants=etcd.service
 
[Service]
EnvironmentFile=/etc/kubernetes/apiserver
ExecStart=/usr/bin/kube-apiserver  \
        $KUBE_ETCD_SERVERS \
        $KUBE_API_ADDRESS \
        $KUBE_API_PORT \
        $KUBE_SERVICE_ADDRESSES \
        $KUBE_ADMISSION_CONTROL \
        $KUBE_API_LOG \
        $KUBE_API_ARGS
Restart=on-failure
Type=notify
LimitNOFILE=65536
 
[Install]
WantedBy=multi-user.target

创建配置文件

代码语言:javascript
复制
$ vim /etc/kubernetes/apiserver 
KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"
KUBE_API_PORT="--port=8080"
KUBELET_PORT="--kubelet-port=10250"
KUBE_ETCD_SERVERS="--etcd-servers=http://192.168.0.101:2379"
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.0.0.0/24"
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"
KUBE_API_ARGS=""

启动服务

代码语言:javascript
复制
$ systemctl daemon-reload
$ systemctl start kube-apiserver.service

查看启动是否成功

代码语言:javascript
复制
$ netstat -tnlp | grep kube
tcp6       0      0 :::6443                 :::*                    LISTEN      10144/kube-apiserve 
tcp6       0      0 :::8080                 :::*                    LISTEN      10144/kube-apiserve 

3.3 安装kube-controller-manager

创建启动文件

代码语言:javascript
复制
$ vim /usr/lib/systemd/system/kube-controller-manager.service
[Unit]
Description=Kubernetes Scheduler
After=kube-apiserver.service
Requires=kube-apiserver.service
 
[Service]
EnvironmentFile=-/etc/kubernetes/controller-manager
ExecStart=/usr/bin/kube-controller-manager \
        $KUBE_MASTER \
        $KUBE_CONTROLLER_MANAGER_ARGS
Restart=on-failure
LimitNOFILE=65536
 
[Install]
WantedBy=multi-user.target

创建配置文件

代码语言:javascript
复制
$ vim /etc/kubernetes/controller-manager
KUBE_MASTER="--master=http://192.168.0.101:8080"
KUBE_CONTROLLER_MANAGER_ARGS=" "

启动服务

代码语言:javascript
复制
$ systemctl daemon-reload
$ systemctl start kube-controller-manager.service

验证服务状态

代码语言:javascript
复制
$ netstat -lntp | grep kube-controll
tcp6       0      0 :::10252                :::*                    LISTEN      10163/kube-controll 

3.4 安装kube-scheduler

创建启动文件

代码语言:javascript
复制
$ vim /usr/lib/systemd/system/kube-scheduler.service
[Unit]
Description=Kubernetes Scheduler
After=kube-apiserver.service
Requires=kube-apiserver.service

[Service]
User=root
EnvironmentFile=/etc/kubernetes/scheduler
ExecStart=/usr/bin/kube-scheduler \
        $KUBE_MASTER \
        $KUBE_SCHEDULER_ARGS
Restart=on-failure
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target

修改配置

代码语言:javascript
复制
$ vim /etc/kubernetes/scheduler
KUBE_MASTER="--master=http://192.168.0.101:8080"
KUBE_SCHEDULER_ARGS="--logtostderr=true --log-dir=/home/log/kubernetes --v=2"

启动服务

代码语言:javascript
复制
$ systemctl daemon-reload
$ systemctl start kube-scheduler.service

验证服务状态

代码语言:javascript
复制
$ netstat -lntp | grep kube-schedule
tcp6       0      0 :::10251                :::*                    LISTEN      10179/kube-schedule 

3.5 配置Profile

代码语言:javascript
复制
$ sed -i '$a export PATH=$PATH:/root/kubernetes/server/bin/' /etc/profile
$ source /etc/profile

3.6 安装 kubectl 并查看状态

代码语言:javascript
复制
$ cp /root/kubernetes/server/bin/kubectl /usr/bin/
$ kubectl get cs
NAME                 STATUS    MESSAGE             ERROR
etcd-0               Healthy   {"health":"true"}   
controller-manager   Healthy   ok                  
scheduler            Healthy   ok 

到这里Master节点就配置完毕。

4. 配置flannel网络

Flannel可以使整个集群的docker容器拥有唯一的内网IP,并且多个node之间的docker0可以互相访问。下载地址

5. 集群验证

在101上执行命令,检查nodes,如果能看到,表明集群现在已经OK了。

代码语言:javascript
复制
$ kubectl get nodes
NAME         STATUS    ROLES     AGE       VERSION
devops-102   Ready     <none>    12s       v1.11.0

参考资料

  • Creating a Custom Cluster from Scratch
  • etcd
  • Creating a single master cluster with kubeadm
  • etcd download
  • 离线安装k8s
  • centos7.3 kubernetes/k8s 1.10 离线安装
  • Kubernetes the hardest way
  • kubernetes 安装学习
  • kubectl get nodes returns "No resources found."
  • nodes with multiple network interfaces can fail to talk to services
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-07-19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 准备规划
    • 1.1 Node 规划
      • 1.2 Network 网络
        • 1.3 安装文件
          • 1.4 系统配置
          • 2. 安装 Node
            • 2.1 Docker
              • 2.2 拷贝 kubelet、kube-proxy
                • 2.3 安装 kube-proxy 服务
                  • 2.4 安装 kubelete 服务
                  • 3. 安装 Master
                    • 3.1 安装etcd
                      • 3.2 安装kube-apiserver
                        • 3.3 安装kube-controller-manager
                          • 3.4 安装kube-scheduler
                            • 3.5 配置Profile
                              • 3.6 安装 kubectl 并查看状态
                              • 4. 配置flannel网络
                              • 5. 集群验证
                              • 参考资料
                              相关产品与服务
                              容器服务
                              腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                              领券
                              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档