国内环境安装kubernetes(一)
这里写自定义目录标题无须科学上网安装k8s(一)1.环境准备2.安装docker(所有节点)2.1安装依赖2.2配置镜像仓库2.3安装2.4启动、设置开启开机启动2.5查看docker服务状态3.系统设置(所有节点)3.1关闭、禁用防火墙3.2设置系统参数 - 允许路由转发,不对bridge的数据进行处理3.3 配置host文件4.准备二进制文件(所有节点)5.准备配置文件(所有节点)5.1 下载
公司需要使用kubernetes,首先需要安装,网上的教程都需要科学上网,不然会出现很多莫名的坑,照着现有的文章,一个星期也没搞定,差点崩溃,现在把整个安装过程详细记录下来,不需科学上网也能轻松安装。
1.环境准备
准备三台centos虚拟机,如果是其他系统需替换相应语句,每一台一核2G内存。信息如下:
IP地址 | 节点角色 | CPU | Memory | Hostname |
---|---|---|---|---|
192.168.200.243 | master | 1 | 2G | server01 |
192.168.200.244 | worker | 1 | 2G | server02 |
192.168.200.245 | worker | 1 | 2G | server03 |
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
更多推荐
所有评论(0)