资讯详情

k8s基础学习笔记

k8s

组件说明:

Master :任务分配调度端 Master可以有多个端 (高可用建筑Master节点必须大于1奇数 如3.5.7等)当Master三个节点允许一个节点死亡 五个节点允许死亡

node:可以有任何真实节点

Kubelet:通过维护容器的生命周期O-CRI实现接口调用k8s 与容器层对接也负责 Volume(CSI)和网络(CNI)的管理

Kube-proxy :负责为 Service 提供 cluster 内部服务发现与负载平衡 通过调用net links接口实现iptables ipvs的规则创建

etcd : 可靠的分布式键值存储服务 分布式集群存储关键数据 协助分布式集群的正常运行

Raft : 共识算法 每一个Raft集群包含多个服务器的任何时刻 每个服务器都可能在 leder、 follower 和candidate状态 正常情况下,一个集群只有一个leder 其他服务器都是 follower状态

etcd的接口版本 v2 将数据写入内存 v3 将数据写入本地文件系统 实现数据的持久性 但并发量较低

Kubernetes API Server :作为 Kubernetes 该系统的入口包装了核心对象的添加、删除和检查操作 RESTful API 接口方式提供给外部客户和内部组件调用。维护的 REST 对象持久到 Etcd 中存储

Kubernetes Scheduler:新建立的 Pod 进行节点 (node) 负责集群资源调度的选择(即分配机器)。组件可以很容易地被其他调度器取代

Controller Manager :负责维护故障检测、自动扩展、滚动更新等集群状态

Container runtime :负责镜像管理以及 Pod 以及容器的真实运行(CRI)

插件说明:

Core DNS :集群内域名和地址的分析关系

Ingress controller :为k8s服务提供外网入口 ,给k8s集群提供一个七层负载

Prometheus :为整个集群提供资源监控能力

Dashboard :提供 B/S 访问系统允许用户通过 web 集群管理和设置

Federation :提供不同数据中心的跨可用区集群 K8S 集群管理能力

Pod概念

Pod : k8s最小调度单位

pause :谷歌创作的非常精简的镜像大小只有几个MB 它是Pod第一个启动容器 启动后,实现两个功能1的初始化网络战,2挂载存储卷

main-C :每一个Pod至少有一个main-c容器 也可以有多个

#Pod创建 docker run --name x1 -d pause               #启动pause docker run --name x2 --volumes-from x1 --network container:x1   #启动mainc --volumes-from x1 持久化数据 --network container:x1 共享网络  

自主式Pod :优点创造简单,缺点不稳定

控制器管理Pod :

控制器

ReplicationController 用于确保容器应用的副本数始终保持在用户定义的副本数中,即如果容器异常退出,将自动创建新的副本数 Pod 替换;如果容器异常多,也会自动回收。在新版本的 Kubernetes 中建议使用 ReplicaSet 来取代 ReplicationControlle 简写为RC

ReplicaSet 跟 ReplicationController 没有本质的区别,只是名字不同,而且 ReplicaSet 支持集合式 selector (标签选择器) 简写为RS

RS包含RC的所有功能 但RS支持集合标签选择器

虽然 ReplicaSet 可独立使用,但一般建议使用 Deployment 来自动管理 ReplicaSet ,这样就不用担心与其他机制的不兼容(比如 ReplicaSet 不支持 rolling-update 但 Deployment 支持)Deployment 不会接创建pod 它会创建RS 由RS创建Pod该机制可支持滚动更新和回滚

扩展:黑白部署: 拿出同样数量的机器 部署新版本 将旧版本上的所有流量迁移到新版本上 完成更新

金丝雀部署:在一定数量的机器中挑选出一个 部署新版本 当这台机器的新版本运行一段时间没有问题时,更新所有机器

Horizontal Pod Autoscaling 仅适用于 Deployment 和 ReplicaSet ,在 V1 只支持版本中的基础 Pod 的 CPU 利用扩所容,在 v1alpha 版本中,根据内存和用户自定义支持 metric 扩缩容 该控制器不能独立存在 必须依附于Deployment和 ReplicaSet

StatefulSet 解决有状态服务问题(对应) Deployments 和 ReplicaSets 其应用场景包括:

稳定的持久存储,即 Pod 基于相同的持久数据,重新调度后仍可访问 PVC 来实现

网络标志稳定,即 Pod 重新调度后 PodName 和 HostName 不变,基于 Headless Service (即没有 Cluster IP 的 Service )来实现

有序部署,有序扩展,即 Pod 是有序的,在部署或扩展时要按照定义的顺序依次进行(即从 0 到 N-1,在下一个 Pod 运行前的一切 Pod 必须都是 Running 和 Ready 状态),基于 init containers 来实现

有序收缩,有序删除(即从 N-1 到 0)

DaemonSet 确保一切(或一些)Node 上运行一个 Pod 副本 Node 加入集群时,也会给他们增加一个新的 Pod 。当有 Node 这些都是从集群中移除的 Pod 也可回收 DaemonSet 它创建的一切都将被删除 Pod使用 DaemonSet 一些典型用法:

运行集群存储 daemon,例如在每个 Node 上运行 glusterd、ceph。

在每个 Node 收集上运行日志 daemon,例如fluentd、logstash。

在每个 Node 上运行监控 daemon,例如 Prometheus Node Exporter

Job 负责批处理任务,即只执行一次任务,确保一个或多个批处理任务 Pod 成功结束

job:根据当前退出代码判断任务是否成功执行,直至成功(可以定义最大重试时间,最大重试时间未成功)

Cron Job 基于时间的管理 Job,即: * 在给定的时间点只运行一次* 周期性地在给定的时间点运行 会轮询创建job

网络通信方式

Kubernetes 假设所有的网络模型都假设了 Pod 它们都在平坦的网络空间中,可以直接连接,这是在 GCE(Google Compute Engine)它是现成的网络模型,Kubernetes 假定这个网络已经存在。建在私有云中 Kubernetes 集群不能假设网络已经存在。我们需要在不同的节点上实现这个网络假设 Docker 先打开容器之间的相互访问,然后运行 Kubernetes

Flannel 是 CoreOS 团队针对 Kubernetes 网络规划服务的设计,简单地说,它的功能是由集群中的不同节点主机创建的 Docker 集群中唯一的虚拟容器IP地址。而且它也可以在这里 IP 在地址之间建立覆盖网络(Overlay Network),通过这个覆盖网络,将数据包原封不动地传输到目标容器中

Flannel网络原理

地址规划服务 : 通过flanneld 向etcd 申请网段 所以每个节点的网段都不一致,所以pod 唯一的全集群地址 此时ETCD物理网卡信息将记录网络端和相应节点

覆盖型网络 :数据报纸的二次包装(采用UDP协议)

同一个pod不同容器之间 基于回环接口通信 (lo)

不同pod之间通讯: 同物理机: 基于docker0 不同物理机 :flannel的二次封装

扩展:软路由的安装和配置

创建新的虚拟机 选择其他系统,其他系统 内存1G 内核1核 两张个网卡 一个仅主机 一个NAT 首先只配置主机网卡

安装完成后 配置IP 访问浏览器 进行设置

kubernetes的部署安装

kubernetes 基于golang编写

二进制方案运行

操作容器化方案:kubeadm

系统的初始化

设置系统主机名及 Host 文件的相互解析

hostnamectl  set-hostname   k8s-master01

安装依赖包

yum install -y conntrack ntpdate ntp ipvsadm ipset  iptables curl sysstat libseccomp wget  vim net-tools git

设置防火墙为 Iptables 并设置空规则

systemctl  stop firewalld  &&  systemctl  disable firewalld
yum -y install iptables-services  &&  systemctl  start iptables  &&  systemctl  enable iptables  &&  iptables -F  &&  service iptables save

关闭 SELINUX

swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab        #关闭交换分区
setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

调整内核参数,对于 K8S

cat > kubernetes.conf <<EOF
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
net.ipv4.tcp_tw_recycle=0
vm.swappiness=0 # 禁止使用 swap 空间,只有当系统 OOM 时才允许使用它
vm.overcommit_memory=1 # 不检查物理内存是否够用
vm.panic_on_oom=0 # 开启 OOM	
fs.inotify.max_user_instances=8192
fs.inotify.max_user_watches=1048576
fs.file-max=52706963
fs.nr_open=52706963
net.ipv6.conf.all.disable_ipv6=1
net.netfilter.nf_conntrack_max=2310720
EOF
cp kubernetes.conf  /etc/sysctl.d/kubernetes.conf
sysctl -p /etc/sysctl.d/kubernetes.conf

调整系统时区

# 设置系统时区为 中国/上海
timedatectl set-timezone Asia/Shanghai
# 将当前的 UTC 时间写入硬件时钟
timedatectl set-local-rtc 0
# 重启依赖于系统时间的服务
systemctl restart rsyslog 
systemctl restart crond

设置时间同步服务器

#master节点
vim /etc/chrony.conf         #修改配置文件 如果没有这个配置文件则需要安装 yum -y install chrony
server ntp1.aliyun.com iburst
server ntp2.aliyun.com iburst
server ntp3.aliyun.com iburst #将原本的注释掉改为阿里云的时间同步服务器

# Allow NTP client access from local network.
allow 192.168.88.0/24                                             #修改允许同步的网段
# Serve time even if not synchronized to a time source.
local stratum 10                                                 #取消此选项注释 给予权重
 
#保存退出后执行
systemctl restart chronyd
systemctl enable chronyd


node节点
vim /etc/chronyconf
#指定时间同步服务器为master节点
#保存退出后执行
systemctl restart chronyd
systemctl enable chronyd

关闭系统不需要服务

 systemctl stop postfix && systemctl disable postfix

设置 rsyslogd 和 systemd journald

mkdir /var/log/journal # 持久化保存日志的目录
mkdir /etc/systemd/journald.conf.d
    cat > /etc/systemd/journald.conf.d/99-prophet.conf <<EOF
  [Journal]
  # 持久化保存到磁盘
  Storage=persistent

  # 压缩历史日志
  Compress=yes

  SyncIntervalSec=5m
  RateLimitInterval=30s
  RateLimitBurst=1000

  # 最大占用空间 10G
  SystemMaxUse=10G

  # 单日志文件最大 200M
  SystemMaxFileSize=200M

  # 日志保存时间 2 周
  MaxRetentionSec=2week

  # 不将日志转发到 syslog
  ForwardToSyslog=no
  EOF
 systemctl restart systemd-journald

升级系统内核为 4.44

CentOS 7.x 系统自带的 3.10.x 内核存在一些 Bugs,导致运行的 Docker、Kubernetes 不稳定,例如: rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm

rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
# 安装完成后检查 /boot/grub2/grub.cfg 中对应内核 menuentry 中是否包含 initrd16 配置,如果没有,再安装一次!
yum --enablerepo=elrepo-kernel install -y kernel-lt
# 设置开机从新内核启动
grub2-set-default 'CentOS Linux (4.4.189-1.el7.elrepo.x86_64) 7 (Core)'
reboot                                  #重载
uname -r                                查看当前内核版本

安装

kube-proxy开启ipvs的前置条件

modprobe br_netfilter

cat > /etc/sysconfig/modules/ipvs.modules <<EOF #!/bin/bash modprobe -- ip_vs modprobe -- ip_vs_rr modprobe -- ip_vs_wrr modprobe -- ip_vs_sh modprobe -- nf_conntrack_ipv4 #在5.4内核中 这条参数中_ipv4被去掉了 EOF

chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4

安装 Docker 软件

yum install -y yum-utils device-mapper-persistent-data lvm2

yum-config-manager \
  --add-repo \
  http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
 
yum install -y docker-ce

## 创建 /etc/docker 目录 
mkdir /etc/docker

# 配置 daemon.
cat > /etc/docker/daemon.json <<EOF { "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m" }, "insecure-registries": ["hub.hongfu.com"] } EOF
mkdir -p /etc/systemd/system/docker.service.d

# 重启docker服务
systemctl daemon-reload && systemctl restart docker && systemctl enable docker

安装 Kubeadm (主从配置)

cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=0 repo_gpgcheck=0 gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF
#配置阿里云的源
yum -y  install  kubeadm-1.15.1 kubectl-1.15.1 kubelet-1.15.1       #kubectl-1.15.1在node节点可以不装
systemctl enable kubelet.service                              

初始化主节点

  kubeadm config print init-defaults > kubeadm-config.yaml
	localAPIEndpoint:
        advertiseAddress: 192.168.66.10
    kubernetesVersion: v1.15.1
	networking:
      podSubnet: "10.244.0.0/16"
      serviceSubnet: 10.96.0.0/12
    ---
    apiVersion: kubeproxy.config.k8s.io/v1alpha1
    kind: KubeProxyConfiguration
    featureGates:
      SupportIPVSProxyMode: true
    mode: ipvs

kubeadm init --config=kubeadm-config.yaml --experimental-upload-certs | tee kubeadm-init.log

加入主节点以及其余工作节点

执行安装日志中的加入命令即可

部署网络

kubenretes-master执行以下命令

mkdir -p /usr/local/kubenretes/install                               #创建目录用以保存文件
mv kubeadm-config.yeml kubeadm-init.log /usr/local/kubenretes/install #将初始化配置文件保存到该目录下方便查看
mkdir /usr/local/kubenretes/cni                                        #保存网络插件的目录
mv /root/flannel/*  /usr/local/kubenretes/cni

安装网络插件 flannel

#导入网络插件
tar -zcvf flannel.tar.gz
docker load -i flannel.tar                                            #导入镜像
#将flannel镜像传给n1节点和n2节点的root目录下
docker load -i flannel.tar                                            #n1和n2同样导入镜像
kubectl create -f kube-flannel.yeml                                   #创建资源 -f指定文件 
kubectl delete deployment nginx                                       #删除控制器
kubctl get pod                                                        #查看pod状态 控制器删除后 pod也会被清楚

kubectl get svc 会看到 sve负责当前的负载均衡和对外暴漏

注意 名为kubenretes的svc不能删除 一旦删除 pod就无法访问kubenretes

将命令转换为资源清单
kubectl create deployment nginx --image=wangyanglinux/myapp:v1 --dry-run -o yaml #--dry-run 仅测试不执行 用于测试命令 -o yaml 以yaml格式进行输出 如果写-o json 则以json格式输出

资源清单

k8s中的资源

k8s中所有的内容都抽象为资源,资源实体化后,叫做对象

kubectl get pod -n kube-system                             #这个名称空间内存放着所有的k8s集群的组件
kubectl get pod --all-namespaces                           #查看不同名称空间里的资源
kubectl get pod -o wide                                    #查看详细的pod信息
kubectl get pod --show-labels                              #查看标签
kubectl get pod -l app                                     #列出包含app key的有哪些 只看某一类标签
kubectl get pod -w                                         #监控信息

在 k8s 中,一般使用 yaml 格式的文件来创建符合我们预期期望的 pod ,这样的 yaml 文件我们一般称为资源清单

资源清单格式

apiVersion: group/apiversion  # 如果没有给定 group 名称,那么默认为 core,可以使用 kubectl api-versions # 获取当前 k8s 版本上所有的 apiVersion 版本信息( 每个版本可能不同 )    
kind:       #资源类别
metadata:  #资源元数据
   name
   namespace
   lables
   annotations   # 主要目的是方便用户阅读查找
spec: # 期望的状态(disired state)
status:# 当前状态,本字段有 Kubernetes 自身维护,用户不能去定义

资源清单的常用命令

查看接k8s所有的接口组

[root@k8s-master01 ~]# kubectl api-versions 
admissionregistration.k8s.io/v1beta1
apiextensions.k8s.io/v1beta1
apiregistration.k8s.io/v1
apiregistration.k8s.io/v1beta1
apps/v1
......(以下省略)

[root@k8s-master01 ~]# kubectl explain pod
KIND:     Pod
VERSION:  v1
.....(以下省略)

[root@k8s-master01 ~]# kubectl explain Ingress
KIND:     Ingress
VERSION:  extensions/v1beta1

[root@k8s-master01 ~]# kubectl explain pod
KIND:     Pod
VERSION:  v1

DESCRIPTION:
     Pod is a collection of containers that can run on a host. This resource is
     created by clients and scheduled onto hosts.

FIELDS:
   apiVersion    <string>
     ........
     ........

apiVersion <string>          #表示字符串类型
metadata <Object>            #表示需要嵌套多层字段
labels <map[string]string>   #表示由k:v组成的映射
finalizers <[]string>        #表示字串列表
ownerReferences <[]Object>   #表示对象列表
hostPID <boolean>            #布尔类型
priority <integer>           #整型
name <string> -required-     #如果类型后面接 -required-,表示为必填字段

通过定义清单文件创建 Pod

apiVersion: v1
kind: Pod
metadata:
  name: pod-demo
  namespace: default
  labels:
    app: myapp
    version: v1
spec:
  containers:
  - name: myapp-1
    image: wangyanglinux/myapp:v1
  - name: busybox-1
    image: busybox:v1
    command:
    - "/bin/sh"
    - "-c"                           #将后面的命令作为一条执行 如果是-e 则是用于判断返回码是否为0如不为零则脚本自动退出
    - "sleep 3600"
kubectl get pod xx.xx.xx -o yaml  
<!--使用 -o 参数 加 yaml,可以将资源的配置以 yaml的格式输出出来,也可以使用json,输出为json格式--> 
kubectl get pod -o wide
查看pod的详细信息

通过yeml文件创建pod

kubectl create -f xxxxx.yeml  
kubectl describe pod nginx-pod           #查看对象的详细信息
kubectl logs  pod名称 -c  容器名 -n 名称空间	              #查看日志 指定哪个pod -c 指定容器 -n 指定名称空间

pod的生命周期

时间序列 : 1、创建pause 初始化网络栈和存储卷 和挂载

​ 2、初始化容器的创建init-c但创建后成功了就会离开 不会伴随整个pod的生命周期,init-c必须是一个线性过程 ,第一个没有启动成功那么第二个就不允许启动 init-c可以有多个 如果init-c-1成功了但是init-c-2容器失败了并不会重载init-c-2这个容器,而是重载整个pod 如果重启策略中写了Never 那么init失败之后不会重载该pod

​ (重启策略 spec.restartPollcy 字段类型:string 可选值 :Always 无论pos因为什么关闭 都会重载 、OnFaliure pod以非零退出码终止时 会进行重载 、Never pod终止后kubelet将退出码发送给master 不会进行重载)

​ 3、创建核心代码容器man-c man-c可以有多个,理论上man-c是并行启动的但实际上man-c又是线性的一个过程并不能做到完全同时启动

探针:

​ 就绪探测: 探测容器是否准备好 就绪探测的生命周期是在man-c中的部分 一旦就绪 则不再探测

​ 存活探测:判断容器是否还可用 存货探测的生命周期是从man-c启动后一段时间开始 一直到man-c死亡

​ 每个man -c单独定义就绪探测和存货探测

启动前操作 :

关闭前操作 :发送信号 如 、解除挂载、 备份数据,使用kubelet发送优雅退出信号等操作

探针

探针是kubelet对容器执行定期诊断,kubelet调用由容器实现的Handler 有以下三种类型的处理程序

1、ExecAction :在容器中执行指定命令 如果命令退出时返回码为0则认为诊断成功

TCPSocketAction :对指定端口上的容器的IP地址进行TCP检查,如果端口打开则诊断成功

HTTPGetAction :对指定的端口和路径上的容器的IP执行HTTP Get 请求 如果响应的状态码大于200 且小于400 则认为诊断是成功的

HSTS HTTP严格传输安全协议 在客户端访问后 服务器端返回301或302返回码时会在包头添加一个HSTS的头部 并记录在浏览器的缓存中 下次访问时直接使用https进行访问 避免的第三人攻击

livenessProbe:探测容器是否正常运行 如果正常运行则静默 如果探测失败,则kubelet会杀死容器,并且容器将收到重启策略的影响,如果容器不提供存货探针则 默认状态为Success

readinessProbe:探测容器是否准备好服务请求,如果就绪探测失败 ,断电控制器将从与pod匹配的所有Service的端点中删除该pod的IP地址,初始延迟之前的就绪状态默认为Failure ,如果容器不提供就绪探针 则默认为Success

kubectl exec -it pod名称  -c 容器名 -- /bin/sh          进入容器个命令 格式	

以yeml格式创建的资源清单文件 正常命名应该是 xxx.pod.yeml 但在linux中 .yeml后缀可以省略不写

RS 与 RC 与 Deployment 关联

apiVersion: v1
kind: ReplicationController
metadata:
  name: frontend
spec:
  replicas: 3
  selector:
    app: nginx                                 #标签 控制器通过标签匹配自己的pod 确保容器内的副本数满足用户期望
  template:
    metadata:
      labels:
        app: nginx                             #标签 在RC中 pod的标签要和控制器所匹配的标签完全一致
    spec:
      containers:
      - name: php-redis
        image: wangyanglinux/myapp:v1
        env:
        - name: GET_HOSTS_FROM
          value: dns
          name: zhangsan
          value: "123"
        ports:
        - containerPort: 80
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: frontend
spec:
  replicas: 3
  selector:
    matchLabels:
      tier: frontend                #标签 用于匹配pod 
  template:
    metadata:
      labels:
        app: nginx                 #标签 RS中pod的标签可以有多个 只要有一个和控制器指定的匹配即可
        tier: frontend
        version: V1                #标签 也可以只有一个 全集也是子集的一种
    spec:
      containers:
      - name: myapp
        image: wangyanglinux/myapp:v1
        env:
        - name: GET_HOSTS_FROM
          value: dns
        ports:
        - containerPort: 80

RS 与 Deployment 的关联

deployment并不会直接创建pod,deployment会创建一个RS控制器,由RS控制器来创建pod 滚动更新时会创建一个新的RS控制器,将旧版的期望转移至新版 回收旧的RS创建的pos 新的RS会创建新的pod 默认会保留旧版本的RS控制器 以提供回滚功能

Deployment

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80
kubectl create -f https://kubernetes.io/docs/user-guide/nginx-deployment.yaml --record
## --record参数可以记录命令,我们可以很方便的查看每次 revision 的变化

kubectl scale deployment nginx-deployment --replicas 10      #扩容和缩容使用的是同一条命令 扩容并不会创建新的RS控制器

kubectl autoscale deployment nginx-deployment --min=10 --max=15 --cpu-percent=80

kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1

kubectl rollout undo deployment/nginx-deployment
生产环境中滚动更新和回滚的方式

滚动更新 :将创建这个deployment的yeml文件复制并修改内部的版本信息 命名方式根据公司需求 之后应用新的yeml文件就可以了

​ 使用 kubectl apply -f 新文件名进行滚动更新

回滚 : 使用想要降级的版本的yeml文件

​ 使用kubectl apply -f 老版本文件名 即可进行回滚

命令式定义 写好的顺序 必须按照顺序执行

声明式定义 指定了一个目标 目标如何到达由他自己判断

deployment支持声明声明式定义 使用

 kubectl apply -f 指定文件                       #apply会自动降级 如果它创建的这个文件不支持声明式定义则会将为命令式的

假如您创建了一个有5个niginx:1.7.9 replica的 Deployment,但是当还只有3个nginx:1.7.9的 replica 创建出来的时候您就开始更新含有5个nginx:1.9.1 replica 的 Deployment。在这种情况下,Deployment 会立即杀掉已创建的3个nginx:1.7.9的 Pod,并开始创建nginx:1.9.1的 Pod。它不会等到所有的5个nginx:1.7.9的 Pod 都创建完成后才开始改变航道

在更新时 根据资源清单定义的期望 可以多也可以少 并非是保持和期望一致的pod数量 在老版本中可以最多多一个或少一个,但在新版本中可以多25%或少25%(滚动幅度从1个 变为了整体的25% 留下75%保持客户访问)

无状态服务如apache tomcat等 都可以使用deployment进行部署

什么是 DaemonSet

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: deamonset-example
  labels:
    app: daemonset
spec:
  selector:
    matchLabels:
      name: deamonset-example
  template:
    metadata:
      labels:
        name: deamonset-example
    spec:
      containers:
      - name: daemonset-example
        image: wangyanglinux/myapp:v1

Job

特殊说明

apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  template:
    metadata:
      name: pi
    spec:
      containers:
      - name: pi
        image: perl
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never

CronJob Spec

CronJob

对于软件更新 看新版和旧版的性能是否有变化 是否需要使用新功能 是否修复了bug 机房内的服务器尽量不要重启 避免造成起不来的情况

CronJob Spec

  • **.spec.suspend :挂起,该字段也是可选的。如果设置为 true,后续所有执行都会被挂起。它对已经开始执行的 Job 不起作用。默认值为 false。 ** 挂起和关闭的区别 挂起会把数据持久化到磁盘 关闭数据会清空

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            args:
            - /bin/sh
            - -c
            - date; echo Hello from the Kubernetes cluster
          restartPolicy: OnFailure
$ kubectl get cronjob
NAME      SCHEDULE      SUSPEND   ACTIVE    LAST-SCHEDULE
hello     */1 * * * *   False     0         <none>
$ kubectl get jobs
NAME               DESIRED   SUCCESSFUL   AGE
hello-1202039034   1         1            49s
$ pods=$(kubectl get pods --selector=job-name=hello-1202039034 --output=jsonpath={.items..metadata.name})
$ kubectl logs $pods
Mon Aug 29 21:34:09 UTC 2016
Hello from the Kubernetes cluster

# 注意,删除 cronjob 的时候不会自动删除 job,这些 job 可以用 kubectl delete job 来删除
$ kubectl delete cronjob hello
cronjob "hello" deleted

CrondJob 本身的一些限制

Service 的概念

微服务:将内部的服务体系从一个大块 抽象成多个细分小块 便于维护升级等操作

Service 的类型

Service 在 K8s 中有以下四种类型
  • **LoadBalancer:在 NodePort 的基础上,借助 cloud provider 创建一个外部负载均衡器,并将请求转发到: NodePort ** NodePort的端口必须在30000以上

!为何不使用 round-robin DNS?

代理模式的分类

userspace 使用iptables 将请求负载到kube-proxy上 由kube-proxy进行调度到server上 server将数据返回依然会经过kube-proxy 此时kube-proxy压力特别大

iptables kube-proxy不再负责代理流量了 只负责修改iptables规则 由iptables代理至server即可完成调度

nq 将上一代的iptables修改成了ipvs kube-proxy负责修改ipvs规则 由ipvs代理至server即可完成调度

Ⅲ、ipvs 代理模式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v02oHSgw-1654622605006)(E:\学习视频\课件\k8s\Png\ipvs.png)]

ClusterIP

标签: 连接器eins探针deins探针连接器d

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台