01.k8s集群的安装

1.k8s集群的安装

1.1 k8s的架构

etcd:数据库nosql-非关系型,存储键值对数据,储存K8S集群所有重要信息,持久化
API server:
1.运维人员操作k8s就是操作apiserver,也是最核心的;
2.当scheduler选择好一个合适的node。apiserver会去命令Kubelet服务,然后Kubelet在去调用docker启容器(pod)
Scheduler:调度器,会去选择一个合适的node节点。
Users:外界用户访问的是node节点中的Kube-Proxy,然后Kube-Proxy做端口映射到pod
Kube-Proxy:负责写入规则至iptables、ipvs实现服务映射访问;
Controller Manager:
1.会实时检测容器(pod)是否挂掉,如果某一个容器挂掉了,他会重启给起一个容器;
2.如果要是某一个node节点都挂掉了,它会读取etcd数据库中的数据然后会重新找一台机器将node启动起来,保持服务的高可用;
Kubelet:安装好kubelet服务之后,该服务会自动安装好docker服务;直接跟容器引擎交互实现容器的生命周期管理;
在这里插入图片描述

除了核心组件,还有一些推荐的Add-ons:

组件名称说明
kube-dns负责为整个集群提供DNS服务
core-dns为集群中的svc创建一个域名IP的对应关系解析
Ingress Controller为服务提供外网入口7层
Ingress7层代理
Heapster提供资源监控
Dashboard提供GUI
Federation提供跨可用区的集群
Fluentd-elasticsearch提供集群日志采集、存储与查询
Peometheus提供K8S集群监控能力

1.1.1k8s ingress原理

前提:但是,单独用service暴露服务的方式,在实际生产环境中不太合适

1.ClusterIP的方式只能在集群内部访问。
2.NodePort方式的话,测试环境使用还行,当有几十上百的服务在集群中运行时,NodePort的端口管理是灾难。
3.LoadBalance方式受限于云平台,且通常在云平台部署ELB还需要额外的费用。
ingress可以简单理解为service的service,他通过独立的ingress对象来制定请求转发的规则,把请求路由到一个或多个service中。这样就把服务与请求规则解耦了,可以从业务维度统一考虑业务的暴露,而不用为每个service单独考虑。
举个例子,现在集群有api、文件存储、前端3个service,可以通过一个ingress对象来实现图中的请求转发:
在这里插入图片描述

注释:
ingress对象:
指的是k8s中的一个api对象,一般用yaml配置。作用是定义请求如何转发到service的规则,可以理解为配置模板。
ingress-controller:
具体实现反向代理及负载均衡的程序,对ingress定义的规则进行解析,根据配置的规则来实现请求转发。简单来说,ingress-controller才是负责具体转发的组件,通过各种方式将它暴露在集群入口,外部对集群的请求流量会先到ingress-controller,而ingress对象是用来告诉ingress-controller该如何转发请求,比如哪些域名哪些path要转发到哪些服务等等。

1.2:修改IP地址、主机和host解析

10.0.0.11 k8s-master
10.0.0.12 k8s-node-1
10.0.0.13 k8s-node-2
所有节点需要做hosts解析

1.3:master节点安装etcd

#安装etcd数据库
yum install etcd -y

vim /etc/etcd/etcd.conf
6行:ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
21行:ETCD_ADVERTISE_CLIENT_URLS="http://192.168.111.11:2379"

systemctl start etcd.service
systemctl enable etcd.service

etcdctl set testdir/testkey0 0
etcdctl get testdir/testkey0

etcdctl -C http://192.168.111.11:2379 cluster-health

##etcd原生支持做集群,
##测试练习1:安装部署etcd集群,要求三个节点

1.4:master节点安装kubernetes

yum install kubernetes-master.x86_64 -y

vim /etc/kubernetes/apiserver 
8行:  KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"
11行:KUBE_API_PORT="--port=8080"
17行:KUBE_ETCD_SERVERS="--etcd-servers=http://192.168.111.11:2379"

将23行erviceAccount内容删除
23行:KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"

vim /etc/kubernetes/config
22行:KUBE_MASTER="--master=http://192.168.111.11:8080"

systemctl enable kube-apiserver.service
systemctl restart kube-apiserver.service
systemctl enable kube-controller-manager.service
systemctl restart kube-controller-manager.service
systemctl enable kube-scheduler.service
systemctl restart kube-scheduler.service

#检查服务是否安装正常

[root@k8s-master ~]# kubectl get componentstatus 
NAME                 STATUS    MESSAGE             ERROR
scheduler            Healthy   ok                  
controller-manager   Healthy   ok                  
etcd-0               Healthy   {"health":"true"} 

1.5:2台node节点安装kubernetes

yum install kubernetes-node.x86_64 -y

vim /etc/kubernetes/config 
22行:KUBE_MASTER="--master=http://192.168.111.11:8080"

vim /etc/kubernetes/kubelet
5行:KUBELET_ADDRESS="--address=0.0.0.0"
8行:KUBELET_PORT="--port=10250"
11行:KUBELET_HOSTNAME="--hostname-override=192.168.111.12"
14行:KUBELET_API_SERVER="--api-servers=http://192.168.111.11:8080"

systemctl enable kubelet.service
systemctl start kubelet.service
systemctl enable kube-proxy.service
systemctl start kube-proxy.service

##在master节点检查

[root@k8s-master ~]# kubectl get nodes
NAME        STATUS    AGE
10.0.0.12   Ready     6m
10.0.0.13   Ready     3s

1.6:所有节点配置flannel网络

容器跨宿主机之间的通信网络

yum install flannel -y
sed -i 's#http://127.0.0.1:2379#http://192.168.111.11:2379#g' /etc/sysconfig/flanneld

##master节点:
etcdctl mk /atomic.io/network/config   '{ "Network": "172.16.0.0/16" }'
#在master安装docker是为了减少一台机器,为了做镜像仓库使用,所以安装到master上,其他node节点直接从master上下载镜像文件。
yum install docker -y
systemctl enable flanneld.service 
systemctl restart flanneld.service 
service docker restart
systemctl enable docker
systemctl restart kube-apiserver.service
systemctl restart kube-controller-manager.service
systemctl restart kube-scheduler.service

##node节点:
systemctl enable flanneld.service 
systemctl restart flanneld.service 
service docker restart
systemctl restart kubelet.service
systemctl restart kube-proxy.service

1.7:配置master为镜像仓库

#所有节点
vim /etc/sysconfig/docker
OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false --registry-mirror=https://registry.docker-cn.com --insecure-registry=192.168.111.11:5000'

systemctl restart docker

#master节点
docker run -d -p 5000:5000 --restart=always --name registry -v /opt/myregistry:/var/lib/registry  registry

如下是意外操作:
支节点导入镜像
docker load -i pod-infrastructure-latest.tar.gz
打标签
docker tag docker.io/tianyebj/pod-infrastructure:latest 192.168.111.11:5000/pod-infrastructure:latest
上传私有仓库
docker push 192.168.111.11:5000/pod-infrastructure:latest

#修改走本地仓库,防止走官方镜像(所有支节点)
vim /etc/kubernetes/kubelet
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=192.168.111.11:5000/pod-infrastructure:latest"

然后支节点操作:
systemctl restart kubelet.service

#如果容器跨宿主机之间的网络通信失败,则执行如下操作
#所有节点解决网络通讯失败问题临时生效(所有节点)
iptables -P FORWARD ACCEPT

#永久生效(所有节点)
vim /usr/lib/systemd/system/docker.service
18行:ExecStartPost=/usr/sbin/iptables  -P FORWARD ACCEPT

让docker启动时执行IPTABLES更改防火墙规则 更改完后操作
systemctl daemon-reload 
systemctl restart docker
  • 7
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

愿听风成曲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值