1、K8S 基本介绍
就在 Docker 容器技术被炒得热火朝天之时,大家发现,如果想要将 Docker 应用于具体的业务实现,是存在困难的——编排、管理和调度等各个方面,都不容易。于是,人们迫切需要一套管理系统,对 Docker 及容器进行更高级更灵活的管理。就在这个时候,K8S 出现了。K8S ,就是基于容器的集群管理平台,它的全称,是 kubernetes 。
2、K8S 集群
这个集群主要包括两个部分:
一个 Master 节点(主节点)
一群 Node 节点(计算节点)
一看就明白:Master 节点主要还是负责管理和控制。Node 节点是工作负载节点,里面具体的容器。
Apiserver: 网关
Etcd: 集群状态,node,service,pod
Controller: 每一种资源对应一种 controller 控制器
Schuduler:调度器,选择一个 node 执行请求
3、Master 节点
Master 节点包括 API Server、Scheduler、Controller manager、etcd。API Server 是整个系统的对外接口,供客户端和其它组件调用,相当于“营业厅”。Scheduler 负责对集群内部的资源进行调度,相当于“调度室”。Controller manager 负责管理控制器,相当于“大总管”。
4、Node 节点
Node 节点包括 Docker、kubelet、kube-proxy、Fluentd、kube-dns(可选),还有就是 Pod。
二、K8S 原理进阶
1 、Scheduler 调度原理
k8s scheduler 当前提供的默认调度流程分为两步:
1.预选调度过程,即遍历所有目标 Node,筛选出符合要求的候选节点,k8 是内置了多种预选策略供用户选择。
2.确定最优节点,在第一步的基础上,采用优选策略(xxx priority)计算出每个候选节点的
积分,积分最高者胜出。
2 、服务发现与负载均衡
2.1 、为什么需要服务发现
在 K8s 集群里面会通过 pod 去部署应用,与传统的应用部署不同,传统应用部署在给定的机器上面去部署,我们知道怎么去调用别的机器的 IP 地址。但是在 K8s集群里面应用是通过 pod 去部署的, 而 pod 生命周期是短暂的。在 pod 的生命周期过程中,比如它创建或销毁,它的 IP 地址都会发生变化,这样就不能使用传统的部署方式,不能指定 IP 去访问指定的应用。另外在 K8s 的应用部署里,之前虽然学习了 deployment 的应用部署模式,但还是需要创建一个 pod 组,然后这些 pod 组需要提供一个统一的访问入口,以及怎么去控制流量负载均衡到这个组里面。比如说测试环境、预发环境和线上环境,其实在部署的过程中需要保持同样的一个部署模板以及访问方式。因为这样就可以用同一套应用的模板在不同的环境中直接发布。
2.2 、Service :Kubernetes 中的服务发现与负载均衡
最后应用服务需要暴露到外部去访问,需要提供给外部的用户去调用的。我们上节
了解到 pod 的网络跟机器不是同一个段的网络,那怎么让 pod 网络暴露到去给外
部访问呢?这时就需要服务发现。
在 K8s 里面,服务发现与负载均衡就是 K8s Service。上图就是在 K8s 里 Service的架构,K8s Service 向上提供了外部网络以及 pod 网络的访问,即外部网络可以通过 service 去访问,pod 网络也可以通过 K8s Service 去访问。向下,K8s 对接了另外一组 pod,即可以通过 K8s Service 的方式去负载均衡到一组 pod 上面去,这样相当于解决了前面所说的复发性问题,或者提供了统一的访问入口去做服务发现,然后又可以给外部网络访问,解决不同的 pod 之间的访问,提供统一的访问地址。
2.3 、service
Service 一个应用服务抽象,定义了 Pod 逻辑集合和访问这个 Pod 集合的策略。
Service 代理 Pod 集合对外表现是为一个访问入口,分配一个集群 IP 地址,来自这个 IP 的请求将负载均衡转发后端 Pod 中的容器。
Service 通过 Lable Selector 选择一组 Pod 提供服务。
首先需要弄明白 Kubernetes 的三种 IP 这个问题:
Node IP:Node 节点的 IP 地址
Pod IP: Pod 的 IP 地址
Cluster IP:Service 的 IP 地址
3 、K8S 网络
在 K8s 中,kube-proxy 有三种模式在实现虚拟 IP、路由信息和报文转发。
userspace 代理模式: 过时,在 k8s 1.2 时候,抛弃
iptables 模式: k8s 默认使用网络模式
IPVS 模式: 速度快,linux 内核负载
三、操作演示
1 、安装 K8S
#1、关闭防火墙
Systemctl disable firewalld
Systemctl stop firewalld
#2、安装 etcd,kubernetes
Yum -y install etcd kubernetes
#3、查询版本
Kubectl version
#4、下载证书
wget http://mirror.centos.org/centos/7/os/x86_64/Packages/python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm
#5、生成证书
rpm2cpio python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm | cpio -iv--to-stdout ./etc/rhsm/ca/redhat-uep.pem | tee /etc/rhsm/ca/redhat-uep.pem
#6、下载 google 镜像,防止中国墙
docker pull registry.cn-hangzhou.aliyuncs.com/google-containers/pause-amd64:3.0
#修改镜像名称,名称是固定的
docker tag registry.cn-hangzhou.aliyuncs.com/google-containers/pause-amd64:3.0
gcr.io/google_containers/pause-amd64:3.0
#7、修改 docker 配置文件
Vi /ect/sysconfig/docker
#修改为如下:
OPTIONS='--selinux-enabled=false --insecure-registry gcr.io'
#8、修改 kubernetes
Vi /etc/kubernetes/apiserver
#删除 Account
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitR
anger,SecurityContextDeny,ResourceQuota"
#9、启动 k8s
systemctl restart etcd docker kube-apiserver kube-controller-manager kube-scheduler kubelet
kube-proxy
2 、部署 nginx
#创建 nginx deployment ,此时只创建了一个 deployment pod
kubectl run my-nginx --image=nginx:latest --port=80
#创建 service,对外暴露服务
kubectl expose deployment/my-nginx --type="NodePort" --port 80
3 、k8s 命令
#查看版本
Kubectl version
#查询集群
Kubectl cluster-info
#查询节点
kubectl get nodes
#运行一个镜像
kubectl run my-nginx --image=nginx:latest –replicas=2 --port=80
#查询 pod
Kubectl get pods
#查询 deployment
Kubectl get deployments
#查询 service
Kubectl describe svc
Kubectl get service
#删除 service
Kubectl delete service 名称
#删除 pod
Kubectl delete pod 名称
#删除 pod,必须删除 deployment
Kubectl delete deployment 名称
4 、yaml
规则:
语法格式:
• 缩进表示层级关系
• 不支持制表符“tab”缩进,使用空格缩进
• 通常开头缩进 2 个空格
• 字符后缩进 1 个空格,如冒号、逗号等
• “---” 表示 YAML 格式,一个文件的开始
• “#”注释
4.1、 Service Yaml
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 8080
protocol: TCP
targetPort: 30001
selector:
app: nginx
4.2 、Deployment Yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx
labels:
app: nginx
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx:latest
imagePullPolicy: IfNotPresent
name: nginx
4.3 、创建服务
# 创建 pod
Kubectl create -f deploy.yaml
# 创建服务
Kubectl create -f svc.yaml
# 升级集群(版本,负载策略,副本数量)
kubeclt apply -f deploy.yaml