K8S基础概念和实践

虚拟化技术

虚拟化技术是一种资源管理技术,将计算机硬件抽象。
Docker 技术是基于 LXC(Linux container- Linux 容器)虚拟容器技术的。
LXC 技术主要是借助 Linux 内核中提供的 CGroup 功能和 namespace 来实现的,通过 LXC 可以为软件提供一个独立的操作系统运行环境。
CGroup:是 Linux 内核提供的一种可以限制、记录、隔离进程组所使用的物力资源 的机制
namespace 是 Linux 内核用来隔离内核资源的方式。
cgroup 和 namespace 两者对比:
两者都是将进程进行分组,但是两者的作用还是有本质区别。namespace 是为了隔离进程组之间的资源,
而 cgroup 是为了对一组进程进行统一的资源监控和限制

Docker对进程进行封装隔离,属于操作系统层面的虚拟化技术

特点:轻量;标准;安全
一致的运行环境;更快速的启动时间;隔离性;弹性伸缩,快速扩展;迁移方便;持续交付和部署.
Docker如何解决不同系统环境的问题?
Docker将用户程序与所需要调用的系统(比如Ubuntu)函数库一起打包
Docker运行到不同操作系统时,直接基于打包的函数库,借助于操作系统的Linux内核来运行

容器和虚拟机

容器是一个应用层抽象,用于将代码和依赖资源打包在一起。 多个容器可以在同一台机器上运行,共享操作系统内核,但各自作为独立的进程在用户空间中运行
虚拟机 (VM) 是一个物理硬件层抽象,用于将一台服务器变成多台服务器
docker是一个系统进程;虚拟机是在操作系统中的操作系统

docker

容器就是将软件打包成标准化单元,以用于开发、交付和部署。
容器镜像是轻量的、可执行的独立软件包
容器化软件在任何环境中都能够始终如一地运行
容器虚拟化的是操作系统而不是硬件,容器之间是共享同一套操作系统资源的。虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统

镜像(Image):一个特殊的文件系统,提供容器运行时所需的程序、库、资源、配置.
容器(Container):镜像运行时的实体.容器的实质是进程
仓库(Repository):集中存放镜像文件的地方

docker build(构建镜像)->docker push(推送镜像)->docker pull(拉取镜像)->docker save(保存镜像为一个压缩包)->docker load(加载压缩包为镜像)

容器三个状态:允许。暂停。停止。

数据卷

数据卷(volume)是一个虚拟目录,指向宿主机文件系统中的某个目录。
创建一个数据卷,并查看数据卷在宿主机的目录位置:
docker volume create html
docker volume ls
docker volume inspect html (查看数据卷详细信息,包括关联的宿主机目录位置)
docker volume rm:删除指定数据卷
docker volume prune:删除所有未使用的数据卷
数据卷的作用:将容器与数据分离,解耦合,方便操作容器内数据,保证数据安全

挂载数据卷:
在创建容器时,可以通过 -v 参数来挂载一个数据卷到某个容器内目录
-v [宿主机目录]:[容器内目录]

容器能够直接将数据持久化到指定的目录上,这个目录就称之为数据卷。
第一种是通过 bind 的方式,直接将宿主机的目录直接挂载到容器内;
第二种是将目录管理交给运行引擎。

镜像分层

镜像是分层结构,每一层称为一个Layer
BaseImage层,包含基本的系统函数库,环境变量,文件系统。
Entrypoint层,镜像中应用启动的命令
其它:添加依赖,配置等资源。

Dockerfile结构

Dockerfile:
FROM:指定基础镜像
ENV:指定基础镜像
WORKDIR 行表示会把接下来的构建步骤都在哪一个相应的具体目录下进行,其起到的作用类似于 Shell 里面的 cd;
COPY:拷贝本地文件到镜像的指定目录
RUN :shell命令,当我们运行完毕之后就可以得到一个应用了;
CMD 行表示使用镜像时的默认程序名字
有了 Dockerfile 之后,就可以通过 docker build 命令构建出所需要的应用
通过 docker push 就能够将本地镜像推动到镜像仓库中

Docker镜像仓库

docker run -d
–restart=always
–name registry
-p 5000:5000
-v registry-data:/var/lib/registry
registry

推送,拉取镜像
1.重新tag本地镜像,名称前缀为私有仓库的地址:192.168.150.101:8080/
docker tag nginx:latest 192.168.150.101:8080/nginx:1.0
2.推送镜像
docker push 192.168.150.101:8080/nginx:1.0
3.拉取镜像
docker pull 192.168.150.101:8080/nginx:1.0

K8S

K8S,就是基于容器的集群管理平台

K8S集群

K8S:一组服务器集群,容器编排工具来对节点中的容器进行管理,实现资源管理的自动化.
主要提供了如下的主要功能
自我修复:一旦某一个容器崩溃,能够在1秒中左右迅速启动新的容器
弹性伸缩:可以根据需要,自动对集群中正在运行的容器数量进行调整
负载均衡:如果一个服务起动了多个容器,能够自动实现请求的负载均衡
版本回退:如果发现新发布的程序版本有问题,可以立即回退到原来的版本
存储编排:可以根据容器自身的需求自动创建存储卷
服务发现:服务可以通过自动发现的形式找到它所依赖的服务

kubernetes组件

一个Master节点,Master节点主要负责管理和控制。Master节点包括API Server、Scheduler、Controller manager、etcd。
API Server是整个系统的对外接口,供客户端和其它组件调用,相当于“营业厅”。
Scheduler负责对集群内部的资源进行调度,相当于“调度室”。
Controller manager负责管理控制器,相当于“大总管”。
Etcd :负责存储集群中各种资源对象的信息

一群Node节点,工作负载节点
Node节点:集群的数据平面,负责为容器提供运行环境 ( 干活 )
包括Pod,Docker、kubelet、kube-proxy、Fluentd、kube-dns(可选)
Pod是Kubernetes最基本的操作单元。一个Pod代表着集群中运行的一个进程,它内部封装了一个或多个紧密相关的容器。
除了Pod之外,K8S还有一个Service的概念,一个Service可以看作一组提供相同服务的Pod的对外访问接口。
Docker,创建容器的
Kubelet,主要负责监视指派到它所在Node上的Pod,包括创建、修改、监控、删除
Kube-proxy,主要负责为Pod对象提供代理。
Fluentd,主要负责日志收集、存储与查询。

kubernetes系统各个组件调用关系

1.环境启动之后,etcd数据库记录master和node的自身信息
2.服务的安装请求发送到master节点的apiServer组件
3.apiServer组件会调用scheduler组件算法调用哪个node节点
4.apiServer调用controller-manager去调度Node节点安装nginx服务
5.kubelet接收到指令后,会通知docker来启动一个nginx的pod
6.通过kube-proxy来对pod产生访问的代理

集群环境搭建

安装方式:
minikube:一个用于快速搭建单节点kubernetes的工具
kubeadm:一个用于快速搭建kubernetes集群的工具
二进制包 :从官网下载每个组件的二进制包,依次去安装,此方式对于理解kubernetes组件更加
有效

kubeadm安装:
1.操作系统环境初始化:主机名解析; 时间同步;禁用iptables和firewalld服务;禁用selinux;禁用swap分区;修改linux的内核参数;配置ipvs功能
2.安装docker
3.安装kubernetes组件:安装kubeadm、kubelet和kubectl
4.master初始化集群
5.node加入集群
6.安装网络插件
7.服务部署

资源管理

资源管理方式:
1.命令式对象:直接使用命令去操作kubernetes资源
kubectl run nginx-pod --image=nginx:1.17.1 --port=80
2.命令式对象配置:通过命令配置和配置文件去操作kubernetes资源
kubectl create/patch -f nginx-pod.yaml
3.声明式对象配置:通过apply命令和配置文件去操作kubernetes资源
kubectl apply -f nginx-pod.yaml

kubectl命令
kubectl --help
kubectl是kubernetes集群的命令行工具,通过它能够对集群本身进行管理,并能够在集群上进行容
器化应用的安装部署。kubectl命令的语法如下:
kubectl [command] [type] [name] [flags]
comand:指定要对资源执行的操作,例如create、get、delete
type:指定资源类型,比如deployment、pod、service
name:指定资源的名称,名称大小写敏感
flags:指定额外的可选参数

资源类型

1.集群级别:namespaces
2.pod:pods
3.pod控制器:replicasets;deployments;jobs
4.服务发现:services;ingress
6.存储:volumeattachments;persistentvolumes(pv)persistentvolumeclaims(pvc)
7.配置 :configmaps

Namespace

Namespace是kubernetes系统中的一种非常重要资源,它的主要作用是用来实现多套环境的资源隔离或者多租户的资源隔离
查看:
1 查看所有的ns 命令:kubectl get ns
2 查看指定的ns 命令:kubectl get ns ns 名称
3 指定输出格式 命令:kubectl get ns ns 名称 -o 格式参数
创建:
kubectl create ns dev
配置方式创建:ns-dev.yaml

apiVersion: v1
kind: Namespace
metadata:
  name: dev

kubectl create -f ns-dev.yaml

删除:
kubectl delete ns dev

Pod

Pod可以认为是容器的封装,一个Pod中可以存在一个或者多个容器。
创建并运行
kubectl run nginx --image=nginx:1.17.1 --port=80 --namespace dev
命令格式: kubectl run (pod控制器名称) [参数]
–image 指定Pod的镜像
–port 指定端口
–namespace 指定namespace
查看pod信息
kubectl get pods -n dev
kubectl describe pod nginx-5ff7956ff6-fg2db -n dev
访问Pod
获取podIP
kubectl get pods -n dev -o wide
访问POD
curl http://10.244.1.23:80
删除指定Pod:
kubectl delete pod nginx-5ff7956ff6-fg2db -n dev
配置操作:

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  namespace: dev
spec:
  containers:
  - image: nginx:1.17.1
    name: pod
    ports:
    - name: nginx-port
      containerPort: 80
      protocol: TCP

Label

Label是在资源上添加标识,用来对它们进行区分和选择。
一个资源对象可以定义任意数量的Label ,同一个Label也可以被添加到任意数量的资源对象上去
版本标签
环境标签
架构标签
Label Selector用于查询和筛选拥有某些标签的资源对象。
基于等式的Label Selector
基于集合的Label Selector
命令方式:
1.为pod资源打标签:kubectl label pod nginx-pod version=1.0 -n dev
2.为pod资源更新标签:kubectl label pod nginx-pod version=2.0 -n dev --overwrite
3. 查看标签:kubectl get pod nginx-pod -n dev --show-labels
4. 筛选标签:kubectl get pod -n dev -l version=2.0 --show-labels
5. 删除标签:kubectl label pod nginx-pod version- -n dev
配置方式:

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  namespace: dev
  labels:
    version: "3.0" 
    env: "test"
spec:
  containers:
  - image: nginx:1.17.1
    name: pod
    ports:
    - name: nginx-port
      containerPort: 80
      protocol: TCP

Deployment

Pod控制器
命令操作:
1.创建: kubectl run nginx --image=nginx:1.17.1 --port=80 --replicas=3 -n dev
命令格式: kubectl run deployment名称 [参数]
–image 指定pod的镜像
–port 指定端口
–replicas 指定创建pod数量
–namespace 指定namespace
2.查看创建的Pod:kubectl get pods -n dev
3.查看deployment的信息:kubectl get deploy -n dev
4.查看deployment的详细信息:kubectl describe deploy nginx -n dev
5. 删除:kubectl delete deploy nginx -n dev
配置操作:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  namespace: dev
spec:
  replicas: 3
  selector:
    matchLabels:
      run: nginx
  template:
    metadata:
      labels:
        run: nginx
    spec:
      containers:
      - image: nginx:1.17.1
        name: nginx
        ports:
        - containerPort: 80
          protocol: TCP

创建:kubectl create -f deploy-nginx.yaml
​删除:kubectl delete -f deploy-nginx.yaml

Service

Service看作是一组同类Pod对外的访问接口
命令操作:
操作一:创建集群内部可访问的Service:
1.暴露Service:CLUSTER-IP,这就是service的IP,这个ip地址只用集群内部可访问
kubectl expose deploy nginx --name=svc-nginx1 --type=ClusterIP --port=80 --target-port=80 -n dev
2.查看service
kubectl get svc svc-nginx -n dev -o wide
操作二:创建集群外部也可访问的Service
kubectl expose deploy nginx --name=svc-nginx2 --type=NodePort --port=80 --target-port=80 -n dev
kubectl get svc svc-nginx-1 -n dev -o wide
删除Service:
kubectl delete svc svc-nginx-1 -n dev
配置操作:

apiVersion: v1
kind: Service
metadata:
  name: svc-nginx
  namespace: dev
spec:
  clusterIP: 10.109.179.231
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    run: nginx
  type: ClusterIP

Pod详解

每个Pod中都可以包含一个或者多个容器,这些容器可以分为两类:
1.用户程序所在的容器
2.Pause容器(根容器):
可以以它为依据,评估整个Pod的健康状态
可以在根容器上设置Ip地址,其它容器都此Ip(Pod IP),以实现Pod内部的网路通信

通过一个命令来查看每种资源的可配置项:
kubectl explain 资源类型 查看某种资源可以配置的一级属性

镜像拉取:imagePullPolicy用于设置镜像拉取策略,kubernetes支持配置三种拉取策略
Always:总是从远程仓库拉取镜像(一直远程下载)
IfNotPresent:本地有则使用本地镜像,本地没有则从远程仓库拉取镜像(本地有就本地 本地没远程下载)
Never:只使用本地镜像,从不去远程仓库拉取,本地没有就报错 (一直使用本地)

资源配额:resources提供了对内存和cpu的资源进行配额的机制
limits:用于限制运行时容器的最大占用资源,当容器占用资源超过limits时会被终止,并进行重启
requests :用于设置容器需要的最小资源,如果环境资源不够,容器将无法启动

Pod生命周期:
pod创建过程
运行初始化容器(init container)过程
运行主容器(main container):钩子,探测
pod终止过程

容器探测:用于检测容器中的应用实例是否正常工作,是保障业务可用性的一种传统机制
存活性探针,用于检测应用实例当前是否处于正常运行状态,如果不是,k8s会重启容器
就绪性探针,用于检测应用实例当前是否可以接收请求,如果不能,k8s不会转发流量
三种探测方式:
Exec命令:在容器内执行一次命令,如果命令执行的退出码为0,则认为程序正常,否则不正常
TCPSocket:将会尝试访问一个用户容器的端口,如果能够建立这条连接,则认为程序正常,否则不正常
HTTPGet:调用容器内Web应用的URL,如果返回的状态码在200和399之间,则认为程序正常,否则不正常

重启策略:容器探测出现了问题,kubernetes就会对容器所在的Pod进行重启,pod的重启策略有 3 种
Always :容器失效时,自动重启该容器,这也是默认值。
OnFailure : 容器终止运行且退出码不为0时重启
Never : 不论状态为何,都不重启该容器

Pod调度

自动调度:运行在哪个节点上完全由Scheduler经过一系列的算法计算得出
定向调度:NodeName、NodeSelector
NodeName用于强制约束将Pod调度到指定的Name的Node节点上
NodeSelector将pod调度到添加了指定标签的node节点上。在pod创建之前,会由scheduler使用MatchNodeSelector调度策略进行label匹配,找出目标node,然后将pod调度到目标节点,该匹配规则是强制约束。
亲和性调度:NodeAffinity、PodAffinity、PodAntiAffinity
nodeAffinity(node亲和性): 以node为目标,解决pod可以调度到哪些node的问题
podAffinity(pod亲和性) : 以pod为目标,解决pod可以和哪些已存在的pod部署在同一个拓扑域中的问题
podAntiAffinity(pod反亲和性) : 以pod为目标,解决pod不能和哪些已存在pod部署在同一个拓扑域中的问题
污点(容忍)调度:Taints、Toleration
Node被设置上污点之后就和Pod之间存在了一种相斥的关系,进而拒绝Pod调度进来,甚至可以将已经存在的Pod驱逐出去。

Pod控制器

自主式pod:kubernetes直接创建出来的Pod,这种pod删除后就没有了,也不会重建
控制器创建的pod:kubernetes通过控制器创建的pod,这种pod删除了之后还会自动重建

Pod控制器是管理pod的中间层,使用Pod控制器之后,只需要告诉Pod控制器,想要多少个什么样的Pod就可以了,它会创建出满足条件的Pod并确保每一个Pod资源处于用户期望的目标状态。如果Pod资源在运行中出现故障,它会基于指定策略重新编排Pod。

ReplicaSet:保证副本数量一直维持在期望值,并支持pod数量扩缩容,镜像版本升级
Deployment:通过控制ReplicaSet来控制Pod,并支持滚动升级、回退版本
Job:它创建出来的pod只要完成任务就立即退出,不需要重启或重建,用于执行一次性任务

Service介绍

真正起作用的其实是kube-proxy服务进程,每个Node节点上都运行着一个kube-proxy服务进程。当创建Service的时候会通过api-server向etcd写入创建的service的信息,而kube-proxy会基于监听的机制发现这种Service的变动,然后它会将最新的Service信息转换成对应的访问规则

kube-proxy目前支持三种工作模式:
userspace 模式,iptables 模式, ipvs模式

Service类型:
ClusterIP:默认值,它是Kubernetes系统自动分配的虚拟IP,只能在集群内部访问
NodePort:将Service通过指定的Node上的端口暴露给外部,通过此方法,就可以在集群外部访问服务
LoadBalancer:使用外接负载均衡器完成到服务的负载分发,注意此模式需要外部云环境支持
ExternalName: 把集群外部的服务引入集群内部,直接使用

Ingress优化:只需要一个NodePort或者一个LB就可以满足暴露多个Service的需求

数据存储

Volume是Pod中能够被多个容器访问的共享目录,它被定义在Pod上,然后被一个Pod里的多个容器挂载到具体的文件目录下,kubernetes通过Volume实现同一个Pod中不同容器之间的数据共享以及数据的持久化存储。Volume的生命容器不与Pod中单个容器的生命周期相关,当容器终止或者重启时,Volume中的数据也不会丢失。

kubernetes的Volume支持多种类型,比较常见的有下面几个:
简单存储:EmptyDir、HostPath、NFS
高级存储:PV、PVC
配置存储:ConfigMap、Secret

PV是持久化卷的意思,是对底层的共享存储的一种抽象。一般情况下PV由kubernetes管理员进行创建和配置,它与底层具体的共享存储技术有关,并通过插件完成与共享存储的对接。

apiVersion: v1  
kind: PersistentVolume
metadata:
  name: pv2
spec:
  nfs: # 存储类型,与底层真正存储对应
  capacity:  # 存储能力,目前只支持存储空间的设置
    storage: 2Gi
  accessModes:  # 访问模式
  storageClassName: # 存储类别
  persistentVolumeReclaimPolicy: # 回收策略

PVC是持久卷声明的意思,是用户对于存储需求的一种声明。换句话说,PVC其实就是用户向kubernetes系统发出的一种资源需求申请。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc
  namespace: dev
spec:
  accessModes: # 访问模式
  selector: # 采用标签对PV选择
  storageClassName: # 存储类别
  resources: # 请求空间
    requests:
      storage: 5Gi
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值