国内环境安装kubernetes(一)

公司需要使用kubernetes,首先需要安装,网上的教程都需要科学上网,不然会出现很多莫名的坑,照着现有的文章,一个星期也没搞定,差点崩溃,现在把整个安装过程详细记录下来,不需科学上网也能轻松安装。

1.环境准备

准备三台centos虚拟机,如果是其他系统需替换相应语句,每一台一核2G内存。信息如下:

IP地址节点角色CPUMemoryHostname
192.168.200.243master12Gserver01
192.168.200.244worker12Gserver02
192.168.200.245worker12Gserver03

2.安装docker(所有节点)

网上有很多安装方法,建议按照我这里,少踩很多坑。

2.1安装依赖

yum install -y yum-utils
``
### 2.2配置镜像仓库
vi  /etc/yum.repos.d/repo.repo
添加下面内容
```javascript
[repo]
name=repo
baseurl = https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/7/x86_64/stable/
enabled=1
gpgcheck=0

2.3安装

依次执行下面语句

sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

更新源

 yum makecache fast

安装

 yum install docker-ce

2.4启动、设置开启开机启动

systemctl start docker
systemctl enable docker

2.5查看docker服务状态

systemctl status docker

如下图安装成功
在这里插入图片描述

3.系统设置(所有节点)

3.1关闭、禁用防火墙

systemctl stop firewalld.service
systemctl disable firewalld.service 

3.2设置系统参数 - 允许路由转发,不对bridge的数据进行处理

新建文件

  vi /etc/sysctl.d/k8s.conf

添加内容

net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1

生效配置文件

sysctl -p /etc/sysctl.d/k8s.conf

3.3 配置host文件

配置host,使每个Node都可以通过名字解析到ip地址
新建文件

  vi /etc/hosts

添加内容

192.168.200.243 server01
192.168.200.244 server02
192.168.200.245 server03

4.准备二进制文件(所有节点)

kubernetes 1.9.0版本百度云盘(百度云怎么不能无提取码分享啊啊啊啊啊)

https://pan.baidu.com/s/1TnQ7m01FgPueAAH1pss-VA 
提取码:da1f

5.准备配置文件(所有节点)

5.1 下载配置文件

$ cd /home
$ git clone https://github.com/qiankunya/kubernetes-starter.git
#看看git内容
$ cd /kubernetes-starter-master && ls

5.2 文件说明

  • gen-config.sh
    shell脚本,用来根据每个同学自己的集群环境(ip,hostname等),根据下面的模板,生成适合大家各自环境的配置文件。生成的文件会放到target文件夹下。

  • kubernetes-simple
    简易版kubernetes配置模板(剥离了认证授权)。 适合刚接触kubernetes的同学,首先会让大家在和kubernetes初次见面不会印象太差(太复杂啦~~),再有就是让大家更容易抓住kubernetes的核心部分,把注意力集中到核心组件及组件的联系,从整体上把握kubernetes的运行机制。

  • kubernetes-with-ca
    在simple基础上增加认证授权部分。大家可以自行对比生成的配置文件,看看跟simple版的差异,更容易理解认证授权的(认证授权也是kubernetes学习曲线较高的重要原因)

  • service-config
    这个先不用关注,它是我们曾经开发的那些微服务配置。 等我们熟悉了kubernetes后,实践用的,通过这些配置,把我们的微服务都运行到kubernetes集群中。

5.3 生成配置

这里会根据大家各自的环境生成kubernetes部署过程需要的配置文件。 在每个节点上都生成一遍,把所有配置都生成好,后面会根据节点类型去使用相关的配置。

#cd到之前下载的git代码目录
$ cd /home/kubernetes-starter-master
#编辑属性配置(根据文件注释中的说明填写好每个key-value)
$ vi config.properties
#生成配置文件,确保执行过程没有异常信息
$ ./gen-config.sh simple
#查看生成的配置文件,确保脚本执行成功
$ find target/ -type f
target/all-node/kube-calico.service
target/master-node/kube-controller-manager.service
target/master-node/kube-apiserver.service
target/master-node/etcd.service
target/master-node/kube-scheduler.service
target/worker-node/kube-proxy.kubeconfig
target/worker-node/kubelet.service
target/worker-node/10-calico.conf
target/worker-node/kubelet.kubeconfig
target/worker-node/kube-proxy.service
target/services/kube-dns.yaml

执行gen-config.sh常见问题:

  • gen-config.sh: 3: gen-config.sh: Syntax error: “(” unexpected
    bash版本过低,运行:bash -version查看版本,如果小于4需要升级
    不要使用 sh gen-config.sh的方式运行(sh和bash可能不一样哦)
  • config.properties文件填写错误,需要重新生成 再执行一次./gen-config.sh simple即可,不需要手动删除target

6.基础集群部署

6.1部署ETCD(主节点)

kubernetes需要存储很多东西,像它本身的节点信息,组件信息,还有通过kubernetes运行的pod,deployment,service等等。都需要持久化。etcd就是它的数据中心。生产环境中为了保证数据中心的高可用和数据的一致性,一般会部署最少三个节点。我们这里以学习为主就只在主节点部署一个实例。
etcd的二进制文件和服务的配置我们都已经准备好,现在的目的就是把它做成系统服务并启动。

#把服务配置文件copy到系统服务目录
 cp /home/kubernetes-starter-master/target/master-node/etcd.service /lib/systemd/system/
#enable服务
 systemctl enable etcd.service
#创建工作目录(保存数据的地方)
 mkdir -p /var/lib/etcd
# 启动服务
 service etcd start
# 查看服务日志,看是否有错误信息,确保服务正常
 journalctl -f -u etcd.service

6.2 部署APIServer(主节点)

1.简介

kube-apiserver是Kubernetes最重要的核心组件之一,主要提供以下的功能

  • 提供集群管理的REST API接口,包括认证授权(我们现在没有用到)数据校验以及集群状态变更等
  • 提供其他模块之间的数据交互和通信的枢纽(其他模块通过API Server查询或修改数据,只有API Server才直接操作etcd)
    生产环境为了保证apiserver的高可用一般会部署2+个节点,在上层做一个lb做负载均衡,比如haproxy。由于单节点和多节点在apiserver这一层说来没什么区别,所以我们学习部署一个节点就足够啦
2.部署

APIServer的部署方式也是通过系统服务。部署流程跟etcd完全一样,不再注释

cp target/master-node/kube-apiserver.service /lib/systemd/system/
 systemctl enable kube-apiserver.service
 service kube-apiserver start
 journalctl -f -u kube-apiserver

6.3部署ControllerManager(主节点)

1 .简介
  • Controller Manager由kube-controller-manager和cloud-controller-manager组成,是Kubernetes的大脑,它通过apiserver监控整个集群的状态,并确保集群处于预期的工作状态。 kube-controller-manager由一系列的控制器组成,像Replication Controller控制副本,Node Controller节点控制,Deployment Controller管理deployment等等 cloud-controller-manager在Kubernetes启用Cloud Provider的时候才需要,用来配合云服务提供商的控制.

  • controller-manager、scheduler和apiserver 三者的功能紧密相关,一般运行在同一个机器上,我们可以把它们当做一个整体来看,所以保证了apiserver的高可用即是保证了三个模块的高可用。也可以同时启动多个controller-manager进程,但只有一个会被选举为leader提供服务。

2 部署

通过系统服务方式部署

 cp target/master-node/kube-controller-manager.service /lib/systemd/system/
 systemctl enable kube-controller-manager.service
 service kube-controller-manager start
 journalctl -f -u kube-controller-manager

6.4部署Scheduler(主节点)

1.简介

kube-scheduler负责分配调度Pod到集群内的节点上,它监听kube-apiserver,查询还未分配Node的Pod,然后根据调度策略为这些Pod分配节点。我们前面讲到的kubernetes的各种调度策略就是它实现的。

2. 部署

通过系统服务方式部署

 cp target/master-node/kube-scheduler.service /lib/systemd/system/
 systemctl enable kube-scheduler.service
 service kube-scheduler start
 journalctl -f -u kube-scheduler

6.5部署CalicoNode(所有节点)

1. 简介

Calico实现了CNI接口,是kubernetes网络方案的一种选择,它一个纯三层的数据中心网络方案(不需要Overlay),并且与OpenStack、Kubernetes、AWS、GCE等IaaS和容器平台都有良好的集成。 Calico在每一个计算节点利用Linux Kernel实现了一个高效的vRouter来负责数据转发,而每个vRouter通过BGP协议负责把自己上运行的workload的路由信息像整个Calico网络内传播——小规模部署可以直接互联,大规模下可通过指定的BGP route reflector来完成。 这样保证最终所有的workload之间的数据流量都是通过IP路由的方式完成互联的。

2. 部署

calico是通过系统服务+docker方式完成的

 cp target/all-node/kube-calico.service /lib/systemd/system/
 systemctl enable kube-calico.service
 service kube-calico start
 journalctl -f -u kube-calico
3. calico可用性验证

查看容器运行情况

docker ps
CONTAINER ID   IMAGE                COMMAND        CREATED ...
4d371b58928b   calico/node:v2.6.2   "start_runit"  3 hours ago...

查看节点运行情况

calicoctl node status
Calico process is running.

IPv4 BGP status
+-----------------+-------------------+-------+------------+-------------+
|  PEER ADDRESS   |     PEER TYPE     | STATE |   SINCE    |    INFO     |
+-----------------+-------------------+-------+------------+-------------+
| 192.168.200.243 | node-to-node mesh | up    | 2020-08-10 | Established |
| 192.168.200.245 | node-to-node mesh | up    | 2020-08-10 | Established |
+-----------------+-------------------+-------+------------+-------------+

IPv6 BGP status
No IPv6 peers found.

查看端口BGP 协议是通过TCP 连接来建立邻居的,因此可以用netstat 命令验证 BGP Peer

netstat -natp|grep ESTABLISHED|grep 179
tcp        0      0 192.168.200.244:46849   192.168.200.243:179     ESTABLISHED 17262/bird          
tcp        0      0 192.168.200.244:38984   192.168.200.245:179     ESTABLISHED 17262/bird  

查看集群ippool情况

calicoctl get ipPool -o yaml
- apiVersion: v1
  kind: ipPool
  metadata:
    cidr: 172.20.0.0/16
  spec:
    nat-outgoing: true

6.6配置kubectl命令(任意节点)

1. 简介

kubectl是Kubernetes的命令行工具,是Kubernetes用户和管理员必备的管理工具。 kubectl提供了大量的子命令,方便管理Kubernetes集群中的各种功能。

2.初始化

使用kubectl的第一步是配置Kubernetes集群以及认证方式,包括:

  • cluster信息:api-server地址
  • 用户信息:用户名、密码或密钥
  • Context:cluster、用户信息以及Namespace的组合
    我们这没有安全相关的东西,只需要设置好api-server和上下文就好啦:
#指定apiserver地址(ip替换为你自己的api-server地址)
kubectl config set-cluster kubernetes  --server=http://192.168.200.243:8080
#指定设置上下文,指定cluster
kubectl config set-context kubernetes --cluster=kubernetes
#选择默认的上下文
kubectl config use-context kubernetes

6.7 配置kubelet(工作节点)

1 简介

每个工作节点上都运行一个kubelet服务进程,默认监听10250端口,接收并执行master发来的指令,管理Pod及Pod中的容器。每个kubelet进程会在API Server上注册节点自身信息,定期向master节点汇报节点的资源使用情况,并通过cAdvisor监控节点和容器的资源。

2 部署

通过系统服务方式部署,但步骤会多一些,具体如下:

#确保相关目录存在
 mkdir -p /var/lib/kubelet
 mkdir -p /etc/kubernetes
 mkdir -p /etc/cni/net.d
#复制kubelet服务配置文件
 cp target/worker-node/kubelet.service /lib/systemd/system/
#复制kubelet依赖的配置文件
 cp target/worker-node/kubelet.kubeconfig /etc/kubernetes/
#复制kubelet用到的cni插件配置文件
 cp target/worker-node/10-calico.conf /etc/cni/net.d/
 systemctl enable kubelet.service
 service kubelet start
 journalctl -f -u kubelet

6.8 为集群增加service功能 - kube-proxy(工作节点)

1 简介

每台工作节点上都应该运行一个kube-proxy服务,它监听API server中service和endpoint的变化情况,并通过iptables等来为服务配置负载均衡,是让我们的服务在集群外可以被访问到的重要方式。

2 部署

通过系统服务方式部署:

#确保相关目录存在
#确保工作目录存在
$ mkdir -p /var/lib/kube-proxy
#复制kube-proxy服务配置文件
$ cp target/worker-node/kube-proxy.service /lib/systemd/system/
#复制kube-proxy依赖的配置文件
$ cp target/worker-node/kube-proxy.kubeconfig /etc/kubernetes/
$ systemctl enable kube-proxy.service
$ service kube-proxy start
$ journalctl -f -u kube-proxy

6.9为集群增加dns功能 - kube-dns(app)

1 简介

kube-dns为Kubernetes集群提供命名服务,主要用来解析集群服务名和Pod的hostname。目的是让pod可以通过名字访问到集群内服务。它通过添加A记录的方式实现名字和service的解析。普通的service会解析到service-ip。headless service会解析到pod列表。

2 部署

通过kubernetes应用的方式部署 kube-dns.yaml文件基本与官方一致(除了镜像名不同外)。 里面配置了多个组件,之间使用”—“分隔

#到kubernetes-starter目录执行命令
$ kubectl create -f target/services/kube-dns.yaml

到此为止一个基础版的k8s集群搭建完成。其他还能我会继续更新。

kubectl get nodes
NAME              STATUS    ROLES     AGE       VERSION
192.168.200.244   Ready     <none>    4d        v1.9.0
192.168.200.245   Ready     <none>    4d        v1.9.0
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值