本文环境 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

可以看到文件列表

  1. [root@devops-101 bin]# pwd
  2. /root/kubernetes/server/bin
  3. [root@devops-101 bin]# ls -lh
  4. total 1.8G
  5. -rwxr-xr-x. 1 root root 57M Jun 28 04:55 apiextensions-apiserver
  6. -rwxr-xr-x. 1 root root 132M Jun 28 04:55 cloud-controller-manager
  7. -rw-r--r--. 1 root root 8 Jun 28 04:55 cloud-controller-manager.docker_tag
  8. -rw-r--r--. 1 root root 134M Jun 28 04:55 cloud-controller-manager.tar
  9. -rwxr-xr-x. 1 root root 218M Jun 28 04:55 hyperkube
  10. -rwxr-xr-x. 1 root root 56M Jun 28 04:55 kube-aggregator
  11. -rw-r--r--. 1 root root 8 Jun 28 04:55 kube-aggregator.docker_tag
  12. -rw-r--r--. 1 root root 57M Jun 28 04:55 kube-aggregator.tar
  13. -rwxr-xr-x. 1 root root 177M Jun 28 04:55 kube-apiserver
  14. -rw-r--r--. 1 root root 8 Jun 28 04:55 kube-apiserver.docker_tag
  15. -rw-r--r--. 1 root root 179M Jun 28 04:55 kube-apiserver.tar
  16. -rwxr-xr-x. 1 root root 147M Jun 28 04:55 kube-controller-manager
  17. -rw-r--r--. 1 root root 8 Jun 28 04:55 kube-controller-manager.docker_tag
  18. -rw-r--r--. 1 root root 149M Jun 28 04:55 kube-controller-manager.tar
  19. -rwxr-xr-x. 1 root root 50M Jun 28 04:55 kube-proxy
  20. -rw-r--r--. 1 root root 8 Jun 28 04:55 kube-proxy.docker_tag
  21. -rw-r--r--. 1 root root 96M Jun 28 04:55 kube-proxy.tar
  22. -rwxr-xr-x. 1 root root 54M Jun 28 04:55 kube-scheduler
  23. -rw-r--r--. 1 root root 8 Jun 28 04:55 kube-scheduler.docker_tag
  24. -rw-r--r--. 1 root root 55M Jun 28 04:55 kube-scheduler.tar
  25. -rwxr-xr-x. 1 root root 55M Jun 28 04:55 kubeadm
  26. -rwxr-xr-x. 1 root root 53M Jun 28 04:56 kubectl
  27. -rwxr-xr-x. 1 root root 156M Jun 28 04:55 kubelet
  28. -rwxr-xr-x. 1 root root 2.3M Jun 28 04:55 mounter

1.4 系统配置

  • 配置Hosts
  • 关闭防火墙
  1. $ systemctl stop firewalld
  2. $ systemctl disable firewalld
  • 关闭selinux
  1. $ vim /etc/selinux/config

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

  • 关闭swap
  1. $ swapoff -a
  2. $ vim /etc/fstab #修改自动挂载配置,注释掉即可
  3. #/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 文件夹中拷贝二进制文件

  1. $ cp /root/kubernetes/server/bin/kubelet /usr/bin/
  2. $ cp /root/kubernetes/server/bin/kube-proxy /usr/bin/

2.3 安装 kube-proxy 服务

  1. $ vim /usr/lib/systemd/system/kube-proxy.service
  2. [Unit]
  3. Description=Kubernetes Kube-Proxy Server
  4. Documentation=https://github.com/GoogleCloudPlatform/kubernetes
  5. After=network.target
  6. [Service]
  7. EnvironmentFile=/etc/kubernetes/config
  8. EnvironmentFile=/etc/kubernetes/proxy
  9. ExecStart=/usr/bin/kube-proxy \
  10. $KUBE_LOGTOSTDERR \
  11. $KUBE_LOG_LEVEL \
  12. $KUBE_MASTER \
  13. $KUBE_PROXY_ARGS
  14. Restart=on-failure
  15. LimitNOFILE=65536
  16. [Install]
  17. WantedBy=multi-user.target

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

  1. $ mkdir -p /etc/kubernetes
  2. $ vim /etc/kubernetes/proxy
  3. KUBE_PROXY_ARGS=""
  4. $ vim /etc/kubernetes/config
  5. KUBE_LOGTOSTDERR="--logtostderr=true"
  6. KUBE_LOG_LEVEL="--v=0"
  7. KUBE_ALLOW_PRIV="--allow_privileged=false"
  8. KUBE_MASTER="--master=http://192.168.0.101:8080"

启动服务

  1. [root@devops-102 ~]# systemctl daemon-reload
  2. [root@devops-102 ~]# systemctl start kube-proxy.service
  3. [root@devops-102 ~]# netstat -lntp | grep kube-proxy
  4. tcp 0 0 127.0.0.1:10249 0.0.0.0:* LISTEN 10522/kube-proxy
  5. tcp6 0 0 :::10256 :::* LISTEN 10522/kube-proxy

2.4 安装 kubelete 服务

  1. $ vim /usr/lib/systemd/system/kubelet.service
  2. [Unit]
  3. Description=Kubernetes Kubelet Server
  4. Documentation=https://github.com/GoogleCloudPlatform/kubernetes
  5. After=docker.service
  6. Requires=docker.service
  7. [Service]
  8. WorkingDirectory=/var/lib/kubelet
  9. EnvironmentFile=/etc/kubernetes/kubelet
  10. ExecStart=/usr/bin/kubelet $KUBELET_ARGS
  11. Restart=on-failure
  12. KillMode=process
  13. [Install]
  14. WantedBy=multi-user.target
  15. $ mkdir -p /var/lib/kubelet
  16. $ vim /etc/kubernetes/kubelet
  17. KUBELET_ADDRESS="--address=0.0.0.0"
  18. KUBELET_HOSTNAME="--hostname-override=192.168.0.102"
  19. KUBELET_API_SERVER="--api-servers=http://192.168.0.101:8080"
  20. KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=reg.docker.tb/harbor/pod-infrastructure:latest"
  21. KUBELET_ARGS="--enable-server=true --enable-debugging-handlers=true --fail-swap-on=false --kubeconfig=/var/lib/kubelet/kubeconfig"

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

  1. apiVersion: v1
  2. kind: Config
  3. users:
  4. - name: kubelet
  5. clusters:
  6. - name: kubernetes
  7. cluster:
  8. server: http://192.168.0.101:8080
  9. contexts:
  10. - context:
  11. cluster: kubernetes
  12. user: kubelet
  13. name: service-account-context
  14. current-context: service-account-context

启动kubelet并进习验证。

  1. $ swapoff -a
  2. $ systemctl daemon-reload
  3. $ systemctl start kubelet.service
  4. $ netstat -tnlp | grep kubelet
  5. tcp 0 0 127.0.0.1:10248 0.0.0.0:* LISTEN 10630/kubelet
  6. tcp 0 0 127.0.0.1:37865 0.0.0.0:* LISTEN 10630/kubelet
  7. tcp6 0 0 :::10250 :::* LISTEN 10630/kubelet
  8. tcp6 0 0 :::10255 :::* LISTEN 10630/kubelet

3. 安装 Master

3.1 安装etcd

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

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

  1. $ tar zxf etcd-v3.2.11-linux-amd64.tar.gz
  2. $ cd etcd-v3.2.11-linux-amd64
  3. $ cp etcd etcdctl /usr/bin/
  4. $ vim /usr/lib/systemd/system/etcd.service
  5. [Unit]
  6. Description=etcd.service
  7. [Service]
  8. Type=notify
  9. TimeoutStartSec=0
  10. Restart=always
  11. WorkingDirectory=/var/lib/etcd
  12. EnvironmentFile=-/etc/etcd/etcd.conf
  13. ExecStart=/usr/bin/etcd
  14. [Install]
  15. WantedBy=multi-user.target
  16. $ mkdir -p /var/lib/etcd && mkdir -p /etc/etcd/
  17. $ vim /etc/etcd/etcd.conf
  18. ETCD_NAME=ETCD Server
  19. ETCD_DATA_DIR="/var/lib/etcd/"
  20. ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379
  21. ETCD_ADVERTISE_CLIENT_URLS="http://192.168.0.101:2379"
  22. # 启动etcd
  23. $ systemctl daemon-reload
  24. $ systemctl start etcd.service

查看etcd状态是否正常

  1. $ etcdctl cluster-health
  2. member 8e9e05c52164694d is healthy: got healthy result from http://192.168.0.101:2379
  3. cluster is healthy

3.2 安装kube-apiserver

添加启动文件

  1. [Unit]
  2. Description=Kubernetes API Server
  3. After=etcd.service
  4. Wants=etcd.service
  5. [Service]
  6. EnvironmentFile=/etc/kubernetes/apiserver
  7. ExecStart=/usr/bin/kube-apiserver \
  8. $KUBE_ETCD_SERVERS \
  9. $KUBE_API_ADDRESS \
  10. $KUBE_API_PORT \
  11. $KUBE_SERVICE_ADDRESSES \
  12. $KUBE_ADMISSION_CONTROL \
  13. $KUBE_API_LOG \
  14. $KUBE_API_ARGS
  15. Restart=on-failure
  16. Type=notify
  17. LimitNOFILE=65536
  18. [Install]
  19. WantedBy=multi-user.target

创建配置文件

  1. $ vim /etc/kubernetes/apiserver
  2. KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"
  3. KUBE_API_PORT="--port=8080"
  4. KUBELET_PORT="--kubelet-port=10250"
  5. KUBE_ETCD_SERVERS="--etcd-servers=http://192.168.0.101:2379"
  6. KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.0.0.0/24"
  7. KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"
  8. KUBE_API_ARGS=""

启动服务

  1. $ systemctl daemon-reload
  2. $ systemctl start kube-apiserver.service

查看启动是否成功

  1. $ netstat -tnlp | grep kube
  2. tcp6 0 0 :::6443 :::* LISTEN 10144/kube-apiserve
  3. tcp6 0 0 :::8080 :::* LISTEN 10144/kube-apiserve

3.3 安装kube-controller-manager

创建启动文件

  1. $ vim /usr/lib/systemd/system/kube-controller-manager.service
  2. [Unit]
  3. Description=Kubernetes Scheduler
  4. After=kube-apiserver.service
  5. Requires=kube-apiserver.service
  6. [Service]
  7. EnvironmentFile=-/etc/kubernetes/controller-manager
  8. ExecStart=/usr/bin/kube-controller-manager \
  9. $KUBE_MASTER \
  10. $KUBE_CONTROLLER_MANAGER_ARGS
  11. Restart=on-failure
  12. LimitNOFILE=65536
  13. [Install]
  14. WantedBy=multi-user.target

创建配置文件

  1. $ vim /etc/kubernetes/controller-manager
  2. KUBE_MASTER="--master=http://192.168.0.101:8080"
  3. KUBE_CONTROLLER_MANAGER_ARGS=" "

启动服务

  1. $ systemctl daemon-reload
  2. $ systemctl start kube-controller-manager.service

验证服务状态

  1. $ netstat -lntp | grep kube-controll
  2. tcp6 0 0 :::10252 :::* LISTEN 10163/kube-controll

3.4 安装kube-scheduler

创建启动文件

  1. $ vim /usr/lib/systemd/system/kube-scheduler.service
  2. [Unit]
  3. Description=Kubernetes Scheduler
  4. After=kube-apiserver.service
  5. Requires=kube-apiserver.service
  6. [Service]
  7. User=root
  8. EnvironmentFile=/etc/kubernetes/scheduler
  9. ExecStart=/usr/bin/kube-scheduler \
  10. $KUBE_MASTER \
  11. $KUBE_SCHEDULER_ARGS
  12. Restart=on-failure
  13. LimitNOFILE=65536
  14. [Install]
  15. WantedBy=multi-user.target

修改配置

  1. $ vim /etc/kubernetes/scheduler
  2. KUBE_MASTER="--master=http://192.168.0.101:8080"
  3. KUBE_SCHEDULER_ARGS="--logtostderr=true --log-dir=/home/log/kubernetes --v=2"

启动服务

  1. $ systemctl daemon-reload
  2. $ systemctl start kube-scheduler.service

验证服务状态

  1. $ netstat -lntp | grep kube-schedule
  2. tcp6 0 0 :::10251 :::* LISTEN 10179/kube-schedule

3.5 配置Profile

  1. $ sed -i '$a export PATH=$PATH:/root/kubernetes/server/bin/' /etc/profile
  2. $ source /etc/profile

3.6 安装 kubectl 并查看状态

  1. $ cp /root/kubernetes/server/bin/kubectl /usr/bin/
  2. $ kubectl get cs
  3. NAME STATUS MESSAGE ERROR
  4. etcd-0 Healthy {"health":"true"}
  5. controller-manager Healthy ok
  6. scheduler Healthy ok

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

4. 配置flannel网络

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

5. 集群验证

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

  1. $ kubectl get nodes
  2. NAME STATUS ROLES AGE VERSION
  3. devops-102 Ready <none> 12s v1.11.0

参考资料

  1. Creating a Custom Cluster from Scratch
  2. etcd
  3. Creating a single master cluster with kubeadm
  4. etcd download
  5. 离线安装k8s
  6. centos7.3 kubernetes/k8s 1.10 离线安装
  7. Kubernetes the hardest way
  8. kubernetes 安装学习
  9. kubectl get nodes returns "No resources found."
  10. nodes with multiple network interfaces can fail to talk to services

离线环境下使用二进制方式安装配置Kubernetes集群的更多相关文章

  1. Cloudera Manager安装之利用parcels方式安装单节点集群(包含最新稳定版本或指定版本的安装)(添加服务)(CentOS6.5)(四)

    不多说,直接上干货! 福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号:   大数据躺过的坑      Java从入门到架构师      人工智能躺过的坑          ...

  2. Linux中安装配置spark集群

    一. Spark简介 Spark是一个通用的并行计算框架,由UCBerkeley的AMP实验室开发.Spark基于map reduce 算法模式实现的分布式计算,拥有Hadoop MapReduce所 ...

  3. 【DevOps】在CentOS中安装Rancher2,并配置kubernetes集群

    准备 一台CentOS主机,安装DockerCE,用于安装Rancher2 一台CentOS主机,安装DockerCE,用于安装kubernetes集群管理主机 多台CentOS主机,安装Docker ...

  4. 安装部署 Kubernetes 集群

    安装部署 Kubernetes 集群 阅读目录: 准备工作 部署 Master 管理节点 部署 Minion 工作节点 部署 Hello World 应用 安装 Dashboard 插件 安装 Hea ...

  5. K8S学习笔记之二进制的方式创建一个Kubernetes集群

    0x00 单节点搭建和简述 minikube Minikube是一个工具,可以在本地快速运行一个单点的Kubernetes,尝试Kubernetes或日常开发的用户使用.不能用于生产环境. 官方地址: ...

  6. 二进制安装部署kubernetes集群---超详细教程

    本文收录在容器技术学习系列文章总目录 前言:本篇博客是博主踩过无数坑,反复查阅资料,一步步搭建完成后整理的个人心得,分享给大家~~~ 本文所需的安装包,都上传在我的网盘中,需要的可以打赏博主一杯咖啡钱 ...

  7. Linux中安装配置hadoop集群

    一. 简介 参考了网上许多教程,最终把hadoop在ubuntu14.04中安装配置成功.下面就把详细的安装步骤叙述一下.我所使用的环境:两台ubuntu 14.04 64位的台式机,hadoop选择 ...

  8. openstack controller ha测试环境搭建记录(五)——配置rabbitmq集群

    配置rabbitmq集群的步骤非常简单,因为其本身含集群功能,参考openstack官网文档:http://docs.openstack.org/ha-guide/controller-ha-rabb ...

  9. 快速安装与配置kubernetes集群搭

    Kubernetes是什么? 首先,它是一个全新的基于容器技术的分布式架构领先方案.这个方案尽然很新,但它是谷歌十几年以来大规模应用容器技术的经验积累和升华的一个重要成果.确切地说,kubernete ...

随机推荐

  1. vue-element-table-js去重合并单元格解析【实战需求】

    有数据如下: { '2019-01-23': [ { 'channel': 'zp', 'listScanListNum': 24, 'listParseOkNum': 0, 'listPersonM ...

  2. Codeforces Round #380 Div.2 F - Financiers Game

    F - Financiers Game 这种两人博弈一般都可以用两个dp写, 一个dp描述第一个人的最优态, 第二个dp描述第二个人的最优态,难点在于优化空间... 我感觉这个空间开得有点玄学.. d ...

  3. flume修改配置文件

    flume修改配置文件后,flume进程会自动将配置文件更新至服务中,同时会初始化日志,重新对于metrics进行记录的. 所以拿api做监控的同学要注意这点啦

  4. Orleans介绍

    一.介绍 Orleans是一个框架,提供了一个直接的方法来构建分布式高规模计算应用程序 默认可扩展 -> Orleans处理构建分布式系统的复杂性,使您的应用程序能够扩展到数百台服务器.低延迟 ...

  5. Android-Binder(一)

    Android-Binder(一) 学习自 <Android开发艺术探索> https://www.jianshu.com/p/bdef9e3178c9 https://blog.csdn ...

  6. C#开发Unity游戏教程之游戏对象的行为逻辑方法

    C#开发Unity游戏教程之游戏对象的行为逻辑方法 游戏对象的行为逻辑——方法 方法(method),读者在第1章新建脚本时就见过了,而且在第2章对脚本做整体上的介绍时也介绍过,那么上一章呢,尽管主要 ...

  7. 分类器评估方法:ROC曲线

    注:本文是人工智能研究网的学习笔记 ROC是什么 二元分类器(binary classifier)的分类结果 ROC空间 最好的预测模型在左上角,代表100%的灵敏度和0%的虚警率,被称为完美分类器. ...

  8. 為你的文件夾添加“使用CMD命令打開”菜單

    最近在項目中,經常使用要使用一些python命令,要打開cmd窗口,再pushd或cd切換到某個文件夾,相當麻煩.於是想,何不在“文件夾”中添加右鍵“pushd”命令呢? 有了目的性,一切似乎就變得簡 ...

  9. luogu P1663 山

    题目链接 luogu P1663 山 题解 只需要求出下凸包的最低点就好了 显然是由两个斜率相反的直线相交来的 盼下最低点为直线的情况 代码 #include<cstdio> #inclu ...

  10. bzoj 3673 可持久化并查集

    本质上是维护两个可持久化数组,用可持久化线段树维护. /************************************************************** Problem: ...