K8S:kubernetes
概念:来自希腊语,k和s之间的8个字母,是一种大规模容器管理技术开源管理。
作用:docker在编排,管理,调度等方面都不容易,能对Docker及容器高灵活的管理。K8S是容器集群管理系统,是一个开源平台,可以实现集群自动化部署,自动化扩容,维护等功能。
适用场景:有大量跨主机的容器需要管理;快速部署应用,快速扩张应用,快速扩展应用,无缝对接应用功能,节省资源,优化硬件资源使用。
核心角色: –master(管理节点):分发任务,与用户进行交互
API:整个系统的对外接口,提供客户端和其他组件的调用。
Scheduler:负责对集群内部资源进行调度,相当于“调度室”。
Controller manager: 负责管理控制器,相当于大总管。
Etcd: 是一个健值储存仓库,储存集群的状态。
–mode(计算节点): 运行容器的节点 (下面对应20-25)
docker:容器管理,
kubelet:负责指派到他的POD,接收master指令然后调用API,管理容器
kube-proxy:为pod访问提供代理,实现service通信和负载均衡。
–image(镜像仓库): 存储镜像的仓库节点(对应100)
-pod: 是kubernetes基本单元,一个pod保函一个或者多个容器,这些容器使用相同的命名空间和端口号,是一个服务的多个进程聚合单位,作为一个独立的部署单位,支持横向扩展和复制。
1.配置一台master 192.168.1.25
把rpm包放在master上的目录中
yum -y install createrepo-0.9.9-28.el7.noarch //安装repo工具
[root@master ~]# createrepo /var/ftp/k8s/ //生成repodata文件
[root@master ~]# ls /var/ftp/k8s/ //查看repodata文件
containernetworking-cni-0.6.0-3.el7.x86_64.rpm kubernetes-1.10.3-0.el7.x86_64.rpm ….//10包
[root@master k8s]# createrepo –update . //升级 rpm包
[root@master ~]# yum list | grep kubernetes //查看是不是升级为 1.10
cockpit-kubernetes.x86_64 195.6-1.el7.centos extras
kubernetes.x86_64 1.10.3-0.el7 updaterpm
kubernetes-client.x86_64 1.10.3-0.el7 updaterpm
kubernetes-kubeadm.x86_64 1.10.3-0.el7 updaterpm
kubernetes-master.x86_64 1.10.3-0.el7 updaterpm
kubernetes-node.x86_64 1.10.3-0.el7 updaterpm
rsyslog-mmkubernetes.x86_64 8.24.0-52.el7 base
2.配置etcd
etcd:基于GO语言实现,为了构建分布式健值数据库,各种服务的配置信息管理分享,服务的发现是一个很基本同时也是很重要的问题,K8S使用etcd来储存网络配置,解决容器互联互通的问题。
etcdctl管理命令:etctctl 子命令 参数 健值
set:设置键值对
get:读取键值对
update:更改键值对
mk :创建新的键值对,rm:删除健值对
mkdir:创建目录,rmdir:删除目录
ls :显示目录和键值对
安装:
[root@master k8s]# yum -y install etcd ///安装etcd
[root@master k8s]# vim /etc/etcd/etcd.conf //修改配置文件ip为默认所有
修改第6行 ETCD_LISTEN_CLIENT_URLS=”http://0.0.0.0:2379″
[root@master k8s]# systemctl enable etcd //开机自启并开启服务
[root@master k8s]# systemctl start etcd
[root@master k8s]# ss -ltun //查看并有2379端口则安装成功
修改配置文件:
[root@master ~]# etcdctl mk /atomic.io/network/config ‘{“Network”: “10.254.0.0/16”, “Backend”: {“Type”: “vxlan”}}’ //设置键值对集群容器网段
{“Network”: “10.254.0.0/16”, “Backend”: {“Type”: “vxlan”}}
[root@master ~]# etcdctl get /atomic.io/network/config //查看键值对集群容器网段
{“Network”: “10.254.0.0/16”, “Backend”: {“Type”: “vxlan”}}
[root@master ~]# etcdctl ls /atomic.io/network/subnets //查看键值对集群ip网段
/atomic.io/network/subnets/10.254.35.0-24
/atomic.io/network/subnets/10.254.71.0-24
/atomic.io/network/subnets/10.254.94.0-24
/atomic.io/network/subnets/10.254.64.0-24
/atomic.io/network/subnets/10.254.30.0-24
/atomic.io/network/subnets/10.254.83.0-24
[root@master ~]# etcdctl get /atomic.io/network/subnets/10.254.94.0-24 //具体查看某个网段对应
{“PublicIP”:”192.168.1.23″,”BackendType”:”vxlan”,”BackendData”:{“VtepMAC”:”8e:6d:ca:94:f0:a9″}} //对应192.168.1.23主机
3.搭建flannel
原理: Flannel实质上是一种“覆盖网络(overlay network)”,也就是将TCP数据包装在另一种网络包里面进行路由转发和通信,目前已经支持UDP、VxLAN、AWS VPC和GCE路由等数据转发方式
默认的节点间数据通信方式是UDP转发。
数据从源容器中发出后,经由所在主机的docker0虚拟网卡转发到flannel0虚拟网卡,这是个P2P的虚拟网卡,flanneld服务监听在网卡的另外一端。源主机的flanneld服务将原本的数据内容UDP封装后根据自己的路由表投递给目的节点的flanneld服务,数据到达以后被解包,然后直接进入目的节点的flannel0虚拟网卡,然后被转发到目的主机的docker0虚拟网卡,最后就像本机容器通信一下的有docker0路由到达目标容器。
Flannel通过Etcd服务维护了一张节点间的路由表,详细记录了各节点子网网段
装包: yum -y install flannel (所有主机node-0001..0005,master)
修改配置文件:
[root@repo ~]# vim /etc/sysconfig/flanneld
FLANNEL_ETCD_ENDPOINTS=”http://192.168.1.25:2379″ // 修改为etcd服务器的地址
[root@repo ~]# systemctl stop docker
[root@repo ~]# systemctl start flanneld docker //先重启flanneld,再重启docker,顺序不能乱
[root@repo ~]# systemctl enable flanneld
4.测试主机网络通信:node-0001和node-0003
主机node-0003:
[root@node-0003 ~]# docker images
192.168.1.100/yan123/myos nginx 99d8bd0a1987 23 hours ago 353 MB
[root@node-0003 ~]# docker run -itd 192.168.1.100/yan123/myos:nginx //后台运行NGINX容器
ca86b78dca64852fd9f5e28c538cb029e6a4aacacf6d471a38f6018e416ac60d
[root@node-0003 ~]# docker inspect ca8 //查看进程容器底层信息,IP
“Gateway”: “10.254.35.1”,
“IPAddress”: “10.254.35.2”,
[root@node-0003 ~]# docker exec -it ca8 /bin/bash //进入容器
[root@ca86b78dca64 html]# ip a s //查看确认IP
inet 10.254.35.2/24 scope global eth0
主机node-0001:同上
验证:
[root@ca86b78dca64 html]# ping 10.254.71.2 //在容器里ping另一主机容器的IP
PING 10.254.71.2 (10.254.71.2) 56(84) bytes of data.
64 bytes from 10.254.71.2: icmp_seq=1 ttl=62 time=1.79 ms
64 bytes from 10.254.71.2: icmp_seq=2 ttl=62 time=0.350 ms
5.kubernets – master安装和配置:
装包:
[root@master ~]# yum -y install kubernetes-master kubernetes-client kubernetes-node
修改配置文件
[root@master ~]# vim /etc/kubernetes/config
KUBE_MASTER=”–master=http://192.168.1.25:8080″ //修改为master的IP
[root@master ~]# vim /etc/kubernetes/apiserver
KUBE_API_ADDRESS=”–insecure-bind-address=0.0.0.0″
KUBE_ETCD_SERVERS=”–etcd-servers=http://192.168.1.25:2379″
KUBE_ADMISSION_CONTROL=”–admission-control=NamespaceLifecycle,LimitRanger,SecurityContextDeny,ResourceQuota” //去掉serviceaccoun
[root@master ~]# vim /etc/hosts //编辑hosts,master需要识别所有的节点信息
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
192.168.1.25 master
192.168.1.20 node-0001
192.168.1.21 node-0002
192.168.1.22 node-0003
192.168.1.23 node-0004
192.168.1.24 node-0005
192.168.1.100 repo
[root@master ~]# for i in {20…25} 100 ;do scp /etc/hosts root@192.168.1.$i:/etc/hosts; done //将/etc/hosts文件复制到所有主机
[root@master ~]# systemctl enable kube-apiserver kube-controller-manager kube-scheduler kube-proxy //服务设置开机自启
[root@master ~]# systemctl start kube-apiserver kube-controller-manager kube-scheduler kube-proxy //启动服务
验证:kubectl get cs
6.kube-node节点安装和配置
装包
[root@node-0001 ~]# yum -y install kubernetes-node
修改master的IP
[root@master ~]# vim /etc/kubernetes/config
KUBE_MASTER=”–master=http://192.168.1.25:8080″ //修改为master的IP
修改node 配置文件
[root@node-0001 ~]# vim /etc/kubernetes/kubelet
KUBELET_ADDRESS=”–address= //修改为0.0.0.0
UBELET_HOSTNAME=”–hostname-override= // 修改为本机名称
KUBELET_ARGS=”–cgroup-driver=systemd –fail-swap-on=false
//添加 –kubeconfig=/etc/kubernetes/kubelet.kubeconfig –pod-infra-container-image=pod-infrastructure:latest
创建kubelet.kubeconfig配置文件:是kubelet的一部分
[root@node-0001 ~]# vim /etc/kubernetes/kubelet.kubeconfig
kind: Config
clusters:
– cluster:
server: http://192.168.1.25:8080 //master的IP
name: local
contexts:
– context:
cluster: local
name: local
current-context: local
kubelet.kubeconfig生成,由master主机创建(可不做)
[root@master ~]# kubectl config set-cluster local –server=”http://192.168.1.25:8080″
[root@master ~]# kubectl config set-context –cluster=”local” local
[root@master ~]# kubectl config set current-context local
[root@master ~]# kubectl config view //最终可以查看上述配置
重启服务
[root@node-0001 ~]#systemctl enable kubelet kube-proxy docker
[root@node-0001 ~]#systemctl start kubelet kube-proxy
[root@node-0001 ~]#systemctl status kubelet kube-proxy //查看服务
验证集群
[root@master ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
192.168.1.20 Ready <none> 55s v1.10.3
上传POD镜像到仓库
[root@ecs-proxy ~]# scp pod-infrastructure.tar root@192.168.1.100:/root/ //复制到repo仓库
[root@repo ~]# docker load -i pod-infrastructure.tar //上传到本地仓库
[root@repo ~]# docker images //查看
REPOSITORY TAG IMAGE ID CREATED SIZE myos
pod-infrastructure latest 99965fb98423 2 years ago 209 MB
[root@repo ~]# docker tag pod-infrastructure:latest 192.168.1.100/yan123/pod-infrastructure:latest //打标签
[root@repo ~]# docker push 192.168.1.100/yan123/pod-infrastructure:latest //上传到共享仓库
创建容器
kubectl run -i -t 群组的名字 –images=镜像的名字(私有仓库)
kubectl run -i -t test –image=192.168.1.100/yan123/myos:nginx(私有仓库)
[root@master ~]# kubectl get deployment //查看运行容器
[root@master ~]# kubectl get pod -o wide
[root@master ~]# kubectl delete deployment test //删除容器
[root@master ~]# kubectl get node //查看节点