目录
kubernetes集群在安装的时候要求有三种网络
kubernetes中各Pod的通信方式
kubernetes中Pod的与Service的通信
kubernetes中Etcd通信
kubernetes通过CNI来接入外部网络
部署前环境的梳理
部署的方式
第一种部署形式
第二种部署形式
第三种部署方式
开始部署
1、各节点时间同步
3、各节点IPtables及Firewalled服务被disable
4、生成.repo文件指向阿里云仓库
5、安装kubelet、kubeadm(初始化集群指令)、 kubectl(api service的命令号客户端,Node不执行命令也可以不安装)
6、通过docker直接获取到的镜像文件,处于某种原因是直接获取不到的【通过docker save 保存;推到自己的私有仓库】
7、docker随后会生成大量的iptables规则,会对我们内部的iptables nf-call-iptables或者nf-call-ip6tables,会需要打开内生的桥接功能
8、初始化kubelet 【不能启动,只能设置开机自启;初始化工作还没有完成】
9、安装提示一步一步操作,查看集集群状态
10、部署Flannel 网络插件
11、节点加入到集群
Pod(Pod网络):每个Pod运行在同一个网段中,可以Ping通
Service(集群网络):和Pod不在同一个网段,Service地址是虚拟的假的,存在IP tables或IPVS中
Node(节点网络):节点的网段又是独立的一个,Node节点的IP地址,即物理机(宿主机)的网卡地址
这种网络Kubernetes不提供,需要于第三方依赖插件来解决,都可以托管在Kubermetes上,单Pod,或者守护进程来启动
提供网络服务: 提供IP
提供网络策略(IPtables规则):去定义来同一个名称空间内,容器内不能访问,各容器之间访问
1、同一个Pod内的多个容器间:通过lo(localhost)通信
在Kubernetes中是允许可个Pod直接通信的:
【桥接网络和叠加网络】
2、物理机桥接:二次通信在ARP的时候是进行广播的,Node在到达一定规模的时候,没有网络空间可以用了,不建议使用
3、叠加网络(Overlay Network):docker0桥固定使用一个子网方式,在docker0桥运行的容器也不会在冲突的了
Service只是IP tables或IPVS规则,Node节点物理机只需要把目标地址不是自己的指向网关(docker0桥的地址),当容器一个容器试图访问一个Service是,送给网关(docker0桥的地址),Docker0桥只需要去检查下iptables或IPVS就可以发现Service的地址了
Service也是会改变的,创建,删除;Pod发生变化通过Label Select来发现,但是Service怎么来该表所有节点的Iptables或IPVS规则尼?这里就需要Kube-proxy组件来进行管理
Etcd通信,一个端口向内部(集群内部)通信,一个端口向外部(客户端)通信;
基于敏感信息使用https通信,在内部通信的时候需要使用点对点的通信,需要一套私有CA证书;
Etcd于客户端(API service)通信提供服务,而服务端的证书于客户端验证是靠同一CA签署来实现,也就是说Etcd和API Service的通信是要双向认证的,需要需要一套专用CA证书,;
API Service于客户但通信的时候也需要一套私有的CA证书,同Etcd和API Service原理;
API Service于可Node的Kube-Proxy通信也是需要一套私有的CA证书,同Etcd和API Service原理;
API Service于可Node的Kubelet通信也是需要一套私有的CA证书,同Etcd和API Service原理;
因此自己搭建的化需要5套私有的CA
CNI:容器网络接口
这些网络可以已Pod的方式运行为其他Pod提供网络服务,这个Pod是个特殊Pod虽然托管在集群中间,但他们需要共享他们的网络名称空间(看到的是物理机的IP)
Kubernetes架构简易图
环境部署图
部署的方式有两种
用传统的形式部署Kubernetes的Master的4个组件和Node节点上3个组件为系统级守护进程,自己去配置证书、配置文件、安装、等等,配置过程繁琐而复杂,一般首次搭建不建议常用
使用工具搭建,在github有人把用Playbook,只需要告诉Ansible谁是Master,谁是Node就可以,这种方式也是把把各组件部署为系统级的守护进程,这种方式Control-Manager宕机了,还需要自己去启动,没有办法保证了宕机后在启动
使用Kubeabm工具来安装,
每个主机上都会安装Kubelet,docker(包括Master), 把主机A初始化为Master,主机B,主机C初始化为Node,每个主机都会Pod的形式来运行Master和Node的组件,这些Pod是静态Pod,而Flannerl是可以被Kubernetes管理的
安装前提
2、各节点主机名称解析:DNS or Hosts
[root@master ~]# cat /etc/hosts
[root@master ~]# systemctl disable firewalld --now #各节点和Master都执行
[root@master yum.repos.d]# vim kubernets.repo
[root@master yum.repos.d]# yum replolist #查看yum源的导入的结果
[root@master yum.repos.d]# scp kubernets.repo node2:/etc/yum.repos.d/ 把报传给其他节点
Index of /kubernetes/yum/doc/ 可以获取key地址
[root@master yum.repos.d]# yum install kubelet kubeadm kubectl -y #会报错
[root@master yum.repos.d]# wget https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
[root@master yum.repos.d]# rpm --import yum-key.gpg
[root@master ~]# vim /usr/lib/systemd/system/docker.service #修改docker的配置文件,指向可以访问到的镜像文件的地址,做代理获取到镜像
[root@master ~]# systemctl daemon-reload #重新加载配置文件
[root@master ~]# systemctl restart docker #重新启动docker
[root@master ~]# docker info #加载成功
[root@master ~]# cat /proc/sys/net/bridge/bridge-nf-call-iptables #保证为1
[root@master ~]# cat /proc/sys/net/bridge/bridge-nf-call-ip6tables #保证为1
[root@master ~]# rpm -ql kubelet #查看配置文件
[root@master ~]# vim /etc/sysconfig/kubelet 【忽略swap交换分区的报警,以前的版本必须关闭swap 】
[root@master ~]# systemctl enable docker #设置开机自启
[root@master ~]# systemctl enable kubelet #设置开机自启
[root@master ~]# [root@master ~]# kubeadm init --kubernetes-version=stable --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --ignore-preflight-errors=Swap --image-repository=registry.aliyuncs.com/google_containers
#初始化拉取相关镜像,初始化成功
[root@master ~]# mkdir -p $HOME/.kube
[root@master ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@master ~]# kubectl get cs #查看集群状态 【componentstatus】
[root@master ~]# kubectl get nodes #获取节点信息
【安装地址:https://github.com/flannel-io/flannel】会基于此清单,下载Flannel清单,部署镜像
[root@master ~]# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
[root@master ~]# kubectl get pods 【并没有启动起来】
[root@master ~]# kubectl get pods -n kube-system #新的名称空间kube-system,当前节点永兴的pods
[root@master ~]# kubectl get ns #获取名称空间
[root@node1 ~]# kubeadm join 192.168.1.104:6443 --token hk5m0i.lad4qho7pkohq8s2 --discovery-token-ca-cert-hash sha256:be41b4aa8b69e6895a386de4ce4969b33ebff12137085b51a01fd48c318e894a --ignore-preflight-errors=Swap
[root@master harbor]# kubectl get nodes #查看添加的结果,node1已经添加到集群中
发现node1上的镜像状态时:NotReady:
[root@node1 ~]# docker image ls #容器的Status的变成Ready状态,一、镜像下载完成,二、启动成功】
[root@master harbor]# kubectl get pods -n kube-system -o wide #查看信息 已启动
[root@master harbor]# kubectl get nodes #已启动完成