k8s 快速入门

k8s 快速入门

k8s初识

学习目标

  • 了解容器是什么

  • 了解容器管理工具有哪些

  • 了解容器编排部署工具有哪些

  • 了解kubernetes

容器

基本了解

为了降低虚拟机造成的物理主机资源浪费,提高物理主机的资源利用率,并能够提供像虚拟机一样良好的应用程序隔离运行环境,人们把这种轻量级的虚拟机,称为"容器"。

  • 主机
  • 虚拟机:和主机共享硬件
  • 容器:和主机共享硬件和操作系统

容器管理工具

容器管理工具类似于虚拟机管理工具,主要用于容器的创建、启动、关闭、删除等。

容器管理工具有:

  • docker公司的docker

  • 国内阿里公司的Pouch

  • LXC、LXD、RKT等等

容器编排部署工具

容器管理工具可以完成容器的基础管理,但是容器的应用并不是只能进行简单应用部署的,可以使用容器完成企业中更加复杂的应用部署,当需要对多应用的系统进行部署时,就需要更加复杂的工具来完成对容器运行应用的编排,这就是我们所说的容器编排部署工具。

容器编排部署工具有:

  • docker 三剑客

    • docker machine

    • docker compose

    • docker swarm

  • mesos + marathon

    • mesos主要作用是在分布式计算过程中,对计算机资源进行管理和分配

    • 是基于Mesos的私有Paas,它实现了Mesos的Framework。Marathon实现了服务发现和负载平衡、为部署提供REST API服务、授权和SSL、配置约束等功能,Marathon支持通过Shell命令和Docker部署应用。

      提供Web界面、支持cpu/mem、实例数等参数设置,支持单应用的Scale,但不支持复杂的集群定义。

    • Mesos和Marathon的关系

      如果将Mesos类比为操作系统的内核,负责资源调度。则Marathon可以类比为服务管理系统,比如init,systemd或upstart等系统,用来管理应用的状态信息。Marathon将应用程序部署为长时间运行的Mesos任务。

  • kubernetes

    • 主要用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效,提供了应用部署、规划、更新、维护的一种机制。

kubernetes

k8s 由来
  • 希腊语:舵手、飞行员

  • 来自于谷歌Borg系统开源

  • 简称于k8s

  • 现归属于CNCF

    • 云原生计算基金会

    • 是一个开源软件基金会,致力于式云计算普遍性和持续性

    • 官方:http://www.cncf.io

k8s 意思

kubernetes是一个轻便的和可扩展的开源平台,用于管理容器化应用和服务。通过Kubernetes能够进行应用的自动化部署和扩缩容。在Kubernetes中,会将组成应用的容器组合成一个逻辑单元以更易管理和发现。Kubernetes积累了作为Google生产环境运行工作负载15年的经验,并吸收了来自于社区的最佳想法和实践。

k8s 功能
  • 自动装箱

    基于容器对应用运行环境的资源配置要求自动部署应用容器

  • 自我修复

    • 当容器失败时,会对容器进行重启

    • 当所部署的Node节点有问题时,会对容器进行重新部署和重新调度

    • 当容器未通过监控检查时,会关闭此容器

    • 直到容器正常运行时,才会对外提供服务

  • 水平扩展

    • 通过简单的命令、用户UI界面或基于CPU等资源使用情况,对应用容器进行规模扩大或规模剪裁
  • 服务发现

    • 用户不需要使用额外的服务发现机制,就能够基于Kubernetes自身能力实现服务发现和负载均衡。
  • 滚动更新

    • 可以根据应用的变化,对应用容器运行的应用,进行一次性或批量式更新
  • 版本回退

    • 可以根据应用部署情况,对应用容器运行的应用,进行历史版本即时回退
  • 密钥和配置管理

    • 在不需要重新构建镜像的情况下,可以部署和更新密钥和应用配置,类似热部署
  • 存储编排

    • 自动实现存储系统挂载及应用,特别对有状态应用实现数据持久化非常重要

    • 存储系统可以来自于本地目录、网络存储(NFS、Gluster、Ceph、Cinder等)、公共云存储服务等

Node及Pod支持
  • Node(节点)数支持

    • 早期版本管理100台

    • 现版本可以管理2000台

  • pod管理支持

    • 早期版本管理1000个

    • 现版本管理150000个

k8s架构

应用部署架构分类

  • 无中心节点架构

    • GlusterFS
  • 有中心节点架构

    • HDFS

    • K8S

k8s集群架构

k8s集群架构节点角色功能

  • Master Node

    • k8s集群控制节点,对集群进行调度管理,接受集群外用户去集群操作请求;

    • Master Node 由 API Server、Scheduler、Cluster State Store ( ETCD数据库 ) 和 Controller Manger Server 所组成

  • Worker Node

    • 集群工作节点,运行用户业务应用容器;

    • Worker Node 包含 kubelet、kube proxy 和 Container Runtime

k8s集群部署

场景

  • k8s集群部署工具有哪些?

  • 需要几台物理服务器?

  • 物理服务器硬件配置有哪些?

  • 每台物理服务器部署什么组件?

  • 部署结束后应该如何测试集群可用性?

学习目标

  • 了解k8s集群部署工具

  • 掌握使用kubeadm部署k8s集群方法

  • 掌握验证k8s集群可用性方法

k8s集群部署工具

二进制源码包部署
  • 获取源码包

  • 部署在各节点中

  • 启动服务

    • Master

      • api-server

      • etcd

      • scheduler

      • controller manager

    • Worker

      • kublet

      • kube-proxy

      • docker

    • 生成证书

      • http

      • https

使用kubeadm部署
  • 安装软件 kubelet kubeadm kubectl

  • 初始化集群

  • 添加node到集群中

  • 证书自动生成

  • 集群管理系统是以容器方式存在,容器运行在master

  • 容器镜像是谷歌提供

    • 阿里云下载容器镜像,需要重新打标记

    • 谷歌下载

使用kubeadm部署kubernetes集群方法

使用kubeadm部署单Master节点k8s集群

主机要求

实际生产中,适当提高硬件配置

  • 硬件

    主机名 操作系统 CPU MEM 角色要求
    master1 CentOS7.6 2 2G master
    work1 CentOS7.6 2 2G worker
    work2 CentOS7.6 2 2G worker
主机准备

所有主机要配置

主机操作系统
主机操作系统 硬件配置 硬盘分区 IP
CentOS7u6 最小化 2C 2G 100G /boot、/ 192.168.216.100
CentOS7u6 最小化 2C 2G 100G /boot、/ 192.168.216.101
CentOS7u6 最小化 2C 2G 100G /boot、/ 192.168.216.102
配置步骤

1.创建存储主机的文件夹

  1. 下载vm,在vm新建虚拟机

  2. 前面硬件兼容性默认选择,操作系统稍后处理,选择Linux操作系统,版本为centos 7 64位,设置虚拟机名称和对应位置

  3. 2个单核CPU

  4. 选择网络

  5. 设置磁盘大小100G

  6. 接下来完成即可,按照上面的步骤创建worker1,2

    需要去下载centos7-x86-64的iso文件,设置iso文件后开启虚拟机

  7. 设置自己舒服的语言

  1. 设置网络
  1. 设置时间为上海时间
  1. 设置磁盘分区
  1. 设置主机用户密码

  2. 等待系统安装重启

主机名
复制代码
 [root@xxx ~]# hostnamectl set-hostname xxx
复制代码
 主机名列表
 192.168.216.100 master1
 192.168.216.101 worker1
 192.168.216.102 worker2
主机IP地址

IP地址根据主机实际情况进行配置

本次使用VMWare Workstation Pro虚拟机部署,需要注意网关设置

复制代码
 [root@xxx ~]# cat /etc/sysconfig/network-scripts/ifcfg-enc33
 DEVICE=eth0
 TYPE=Ethernet
 ONBOOT=yes
 BOOTPROTO=static
 IPADDR=192.168.216.xxx
 NETMASK=255.255.255.0
 GATEWAY=192.168.216.2
 DNS1=119.29.29.29
主机名称解析
复制代码
 [root@xxx ~]# cat /etc/hosts
 127.0.0.1   localhost localhost.localdomain localhost4
 localhost4. localdomain4
 ::1         localhost localhost.localdomain localhost6
 localhost6.localdomain6
 192.168.216.100 master1
 192.168.216.101 worker1
 192.168.216.102 worker2

三台主机进行文件的修改

验证一下

主机安全配置
关闭firewalld
复制代码
 [root@xxx ~]# systemctl stop firewalld
 [root@xxx ~]# systemctl disable firewalld
 ​
 确认是否运行
 [root@xxx ~]# firewall-cmd --state
 not running
SELINUX配置

做出下述修改,一定要重启系统才能生效

复制代码
 [root@xxx ~]# sed -ri 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
主机时间同步

由于最小化安装系统,需要单独安装ntpdate

复制代码
 [root@xxx ~]# yum -y install ntpdate
复制代码
 [root@xxx ~]# crontab -l
 0 */1 * * * ntpdate time1.aliyun.com
永久关闭swap分区

使用kubeadm部署必须关闭swap分区,修改配置文件后需要重启操作系统

复制代码
 [root@xxx ~]Z# cat /etc/fstab
 ​
 #
 # /etc/fstab
 # Created by anaconda on Tue Mar  5 11:40:30 2019
 #
 # Accessible filesystems, by reference, are maintained under '/dev/disk'
 # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) fro more info
 #
 /dev/mapper/centos-root / xfs defaults 0  0
 #/dev/mapper/centos-swap swap swap defaults 0 0
 ​
 在swap文件系统对应的行,行首添加#表示注释
添加网桥过滤
复制代码
 添加网桥过滤及地址转发
 [root@xxx ~]# cat /etc/sysctl.d/k8s.conf
 net.bridge.bridge-nf-call-ip6tables = 1
 net.bridge.bridge-nf-call-iptables = 1
 vm.swappiness = 0
 ​
 加载br_netfilter模块
 [root@xxx ~]# modprobe br_netfilter
 ​
 查看是否加载
 [root@xxx ~]# lsmod | grep br_netfilter
 br_netfilte     22256   0
 bridge          151336  1   br_netfilter
 ​
 加载网桥过滤配置文件
 [root@xxx ~]# sysctl -p /etc/sysctl.d/k8s.conf
 net.bridge.bridge-nf-call-ip6tables = 1
 net.bridge.bridge-nf-call-iptables = 1
 vm.swappiness = 0
开启ipvs
安装ipset及ipvsadm
复制代码
 [root@xxx ~]# yum -y install ipset ipvasadm
在所有节点执行如下脚本
复制代码
 [root@xxx ~]# 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
 EOF
复制代码
 授权、运行、检查是否加载
 [root@xxx ~]# chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
复制代码
 检查是否加载
 [root@xxx ~]# lsmod | grep -e ip_vs -3 nf_conntrack_ipv4

在master节点及worker节点安装指定版本的docker-ce

yum源获取

建议使用清华镜像源,官方提供的镜像源由于网络速度原因下载较慢

复制代码
 [root@xxx ~]# wget -o /etc/yum.repos.d/docker-ce.repo
 https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/docker-ce.repo
查看docker-ce版本

对版本进行排序

复制代码
 [root@xxx ~]# yum list docker-ce.x86_64 --showduplicates | sort -r
安装docker-ce

安装指定版本docker-ce,此版本不需要修改服务启动文件及iptables默认规则链策略

复制代码
 [root@xxx ~]# yum -y install --setopt=obsoletes=0 docker-ce-18.06.3.ce-3.el7

应用docker并启动

修改docker-ce服务配置文件

修改其目的是为了后续使用/etc/docker/daemon.json来进行更多配置

复制代码
 修改内容如下
 [root@xxx ~]# cat /usr/lib/systemd/system/docker.service
 [unit]
 ...
 ​
 [Service]
 ...
 ExecStart=/usr/bin/dockerd #如果原文件此行后面有-H选项,请删除-H(含)后面所有内容
 ...
 ​
 [Install]
 ...
 ​
 注意:有些版本不需要修改
 ​
 # 在/etc/docker/daemon.json添加如下内容:
 [root@localhost ~]# cat /etc/docker/daemon.json
 {
       "exec-opts": ["native.cgroupdriver=systemd"]
 }

部署软件及集群软件准备

软件安装

所有k8s集群节点均需安装,默认YUM源是谷歌,可以使用阿里云YUM

需求 kubeadm kubelet kubectl docker-ce
初始化集群、管理集群等,版本为:1.17.2 用于接收api-server指令,对pod生命周期进行管理,版本为:1.17.2 集群命令行管理工具,版本:1.17.2 18.06.3
  • 谷歌YUM源
  • 阿里云YUM源
  • 安装指定版本kubeadm kubelet kubectl

    复制代码
     [root@xxx ~]# yum list kubeadm.x86_64 --showduplicates | sort -r
     ​
     [root@xxx ~]# yum -y install --setopt=obsoletes kubeadm-1.17.2-0 kubelet-1.17.2-0 kubectl-1.17.2-0
软件设置

主要配置kubelet,如果不配置可能会导致k8s集群无法启动

复制代码
 为了实现docker使用的cgroupdriver与kubelet使用的cgroup的一致性,建议修改如下文件内容
 [root@xxx ~]# vim /etc/sysconfig/kubelet
 KUELET_EXTRA_ARGS="--cgroup-driver=systemd"
复制代码
 设置为开机启动即可,由于没有生成配置文件,集群初始化后自动启动
 [root@xxx ~]# systemctl enable kubelet

k8s集群容器镜像准备

由于使用kubeadm部署集群,集群所有核心组件均以pod运行,需要为主机准备镜像,不同角色主机准备不同镜像

建议使用科学上网方式下载镜像

Master主机镜像
复制代码
 查看集群使用的容器镜像
 [root@master ~]# kubeadm config images list
 k8s.gcr.io/kube-apiserver:v1.17.2
 k8s.gcr.io/kube-controller-manager:v1.17.2
 k8s.gcr.io/kube-scheduler:v1.17.2
 k8s.gcr.io/kube-proxy:v1.17.2
 k8s.gcr.io/pause:3.1
 k8s.gcr.io/etcd:3.4.3-0
 k8s.gcr.io/coredns:1.6.5
 ​
 列出镜像列表到文件中,便于下载使用
 [root@master ~]# kubeadm config images list >> image.list
 ​
 查看已列出镜像文件列表
 [root@master ~]# cat image.pull
 #!/bin/bash
 img_list='
 k8s.gcr.io/kube-apiserver:v1.17.2
 k8s.gcr.io/kube-controller-manager:v1.17.2
 k8s.gcr.io/kube-scheduler:v1.17.2
 k8s.gcr.io/kube-proxy:v1.17.2
 k8s.gcr.io/pause:3.1
 k8s.gcr.io/etcd:3.4.3-0
 k8s.gcr.io/coredns:1.6.5
 '
 for img in $img_list
 do
         docker pull $img
 done
 ​
 执行镜像下载脚本
 [root@master ~]# sh image.pull
 ​
 查看已下载镜像
 [root@master ~]# docker images
worker主机镜像
复制代码
 保存镜像为tar
 [root@master ~]# docker save -o kube-proxy.tar k8s.gcr.io/kube-proxy:v1.17.2
 [root@master ~]# docker save -o pause.tar k8s.gcr.io/pause:3.1
 [root@master ~]# ls
 kube-proxy.tar  pause.tar
 ​
 复制tar到worker节点
 [root@master1 ~]# scp kube-proxy.tar pause.tar work1:/root
 [root@master1 ~]# scp kube-proxy.tar pause.tar work2:/root
 ​
 在worker节点导入镜像
 [root@work1 ~]# ls
 kube-proxy.tar  pause.tar
 [root@work1 ~]# docker load -i kube-proxy.tar
 [root@work1 ~]# docker load -i pause.tar

k8s集群初始化

在master节点操作

复制代码
 [root@master1 ~]# kubeadm init --kubernetes-version=v1.17.2 --pod-network-cidr=172.16.0.0/16 --apiserver-advertise-address=192.168.216.100

根据上图进行相应的操作

每台主机导入相应的镜像

修改calico资源清单文件
应用calio资源清单文件

在应用caclico资源清单文件之前,需要把calico所有的镜像导入到node节点中。

worker节点加入集群

验证k8s集群可用性方法

学习总结

k8s集群客户端工具 kubectl

了解kubectl命令帮助方法

了解kubectl子命令使用分类

kubectl帮助方法

复制代码
 检查kubectl是否安装
 rpm -qa | grep kubectl
 ​
 获取kubectl帮助方法
 kubectl --help

kubectl子命令使用分类

  1. 基础命令

    • create(通过文件名或标准输入创建资源)

    • expose(将一个资源公开为一个新的Service)

    • run(在集群中运行一个特定的镜像)

    • set(在对象上设置特定的功能)

    • get(显示一个或多个资源)

    • explain(文档参考资料)

    • edit(使用默认的编辑器编辑一个资源)

    • delete(通过文件名、标准输入、资源名称或标签选择器来删除资源)

  2. 部署命令

    • rollout(管理资源的发布)

    • rollin-update(对给定的复制控制器滚动更新)

    • scale(扩容或缩容pod数量,Deployment、ReplicaSet、RC或Job)

    • autoscale(创建一个自动选择扩容或缩容并设置pod数量)

  3. 集群管理命令

    • certificate(修改证书资源)

    • cluster-info(显示集群信息)

    • top(显示资源使用。需要Heapster运行)

    • cordon(标记节点不可调度)

  4. 故障诊断和调试命令

    • describe(显示特定资源或资源组的详细信息)

    • logs(在一个Pod中打印一个容器日志,如果Pod只有一个容器,容器名称是可选的)

    • attach(附加到一个运行的容器)

    • exec(执行命令到容器)

    • port-forward(转发一个或多个本地端口到一个pod)

    • proxy(运行一个proxy到kubernetes API server)

    • cp(拷贝文件或目录到容器中)

    • auth(检查授权)

  5. 高级命令

    • apply(通过文件名或标准输入对资源应用配置)

    • patch(使用补丁修改、更新资源的字段)

    • replace(通过文件名或标准输入替换一个资源)

    • convert(不同的API版本之间转换配置文件)

  6. 设置命令

    • label(更新资源上的标签)

    • annotate(更新资源上的注释)

    • completion(用于实现kubect工具自动补全)

  7. 其他命令

    • api-version(打印受支持的API版本)

    • config(修改kubeconfig文件 用于访问api,比如配置认证信息)

    • help(所有命令帮助)

    • plugin(运行一个命令行插件)

    • version(打印客户端和服务版本信息)

使用kubectl命令必要环境

在worker节点如何使用kubectl命令管理k8s集群?

复制代码
 准备集群管理配置文件
 mkdir .kube
 scp master1:/root/.kube/config .kube/
 ​
 使用命令验证
 kubectl get nodes

总结

K8s集群资源清单(YAML)文件书写方法

YAML文件书写格式

yaml介绍

yaml:仍是一种标记语言

为了强调这种语言以数据作为中心,而不是以标记语言为重点

YAML是一种可读性高,用来表达序列的格式

基本语法
  • 使用空格作为缩进

  • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可

  • 低版本缩进时不允许使用Tab键,只允许使用空格

  • 使用#标识注释,从这个字符一直到行尾,都会被解释器忽略

YAML支持的数据结构
  • 对象

    • 键值对的集合

    • 又称为映射(mapping)/哈希(hashes)/字典(dictionary)

复制代码
 # 对象类型:对象的一组键值对,使用冒号结构表示
 name: Tom
 age: 18
 ​
 # Yaml 也允许另一种写法,将所有键值对写成一个行内对象
 hash: {name: Tom, age: 18}
  • 数组

    • 一组按次序排列的值

    • 又称为序列(sequence)/列表(list)

复制代码
 # 数组:一组连词线开头的行,构成一个数组
 People
 - Tom
 - Jack
 ​
 # 数组也可以采用行内表示法
 People: [Tom, Jack]
  • 纯量(scalars):

    • 单个的、不可再分的值
复制代码
 # 纯量:纯量是最基本的、不可再分的值。以下数据类型都属于纯量
 ​
 # 数值直接以字面量的形式表示
 number: 12.30
 ​
 # 布尔值用true和fa1se表示
 isset: true
 ​
 # null 用 ~ 表示
 ​
 parent: ~
 ​
 # 时间采用 IS08601 格式
 1s08601: 2001-12-14t21:59:43.10-05:00
 ​
 # 日期采用符合 IS08601 格式的年、月、日表示
 date: 1976-07-31
 ​
 # YAML允许使用两个感叹号,强制转换数据类型
 e: !!str 123
 f: !!str true
 ​
 # 字符串默认不使用引号表示
 str: 这是一行字符串
 ​
 # 如果字符串之中包含空格或特殊字符,需要放在引号之中
 str: '内容: 字符串'
 ​
 # 单引号和双引号都可以使用,双引号不会对特殊字符转义
 s1: '内容\n字符串'
 s2: "内容\n字符串"
 ​
 # 单引号之中如果还有单引号,必须连续使用两个单引号转义
 str: 'labor''s day'
 ​
 #字符串可以写成多行,从第二行开始,必须有一个单空格缩进。换行符会被转为空格
 str: 这是一段
   多行
   字符串
   
 # 多行字符串可以使用|保留换行符,也可以使用>折叠换行
 this: |
 Foo
 Bar
 that
 Foo
 Bar

资源清单描述方法

常用字段
参数名 字段类型 说明
version String 这里是指的是 K8s API的版本,目前基本上是v1,可以用kubectl api-versions命令查询
kind String 这里指的是yaml文件定义的资源类型和角色,比如:Pod
metadata Object 元数据对象,固定值就写metadata
metadata.name String 元数据对象的名字,这里由我们编写,比如命名Pod名字
metadata.namespace String 元数据对象的命名空间,这里由我们定义
spec Object 详细定义对象,固定值就写Spec
spec.containers\[\].name String 这里定义容器的名字
spec.containers\[\].image String 这里定义要用到的镜像名称
spec.containers\[\].imagePullPolicy String 定义镜像拉取策路,有Always、Never、IfNotPresent三个值可选 (1)Always: 意思是每次都尝试重新拉取镜像 (2)Never: 表示仅使用本地镜像 (3)IfNotPresent: 如果本地有镜像就使月本地镜像,没有就拉取在线镜像。 上面三个值都没设置的话,默认是Always。
spec containers\[\].command\[\] List 指定容器启动命令,因为是数组可以指定多个。不指定则使用镜像打包时使用的启动命令。
spec.containers\[\].args List 指定容器启动命令参数,因为是数组可以指定多个
spec.cantainers\[\].workDir String 指定容器的工作目录
spec.containers\[\].yolumeMounts\[\] List 指定容器内部的存储卷配置
spec.containers\[\].yolumeMounts\[\].name String 指定可以被容器挂截的存储卷的名称
spec.containers\[\]. volumeMounts\[\].mountPath String 指定可以被容器捱戴的存储卷的路径
spec.containers\[\].volumeMounts\[\].readOnly String 设置存储卷路径的读写模式,ture或者false,默认为读写模式
spec.containers \[\].ports\[\] String 指定容器需要用到的端口列表
spec.containers \[\].ports\[\].name String 指定端口名称
spec.dontainers \[\].ports\[\].containerPort String 指定容器需要监听的端口号
spec.containers .ports\[.hostPort String 指定容所在主机需要监听的端口号,默认跟上面containerPort相同,注意设置了hostPort同一台主机无法启动该容器的相同副本(因为主机的端口号不能相同,这样会冲突)
spec.containers\[\].ports\[\].protocol String 指定端口协议,支持TCP和UDP,默认值为TCP
spec.containers \[\].env\[\] List 指定容器运行前需设的环境变量列表
spec.containers \[\].env\[\].name String 指定环境变量名称
spec.containers \[\].env\[\].value String 指定环境变量值
spec.containers\[\].resources Object 指定资源限制和资源请求的值(这里开始就是设置容器的资源上限)
spec.containers\[\].resources.limit Object 指定设置容器运行时资源的运行上限
spec.containers\[\].resources.limit.cpu String 指定CPU限制,单位为core数,将用于docker run --cpu -shares 参数
spec.containers\[\].resources.limits.memory String 指定MEM内存的限制,单位为MiB、GiB
spec.containers\[\].resources.requests Object 指定容器启动和调度时的限制设置
spec.containers\[\].resources.requests.cpu String CPU请求,单位为core数,容器启动时初始化可用数量
spec.containers\[\].resources.requests.memory String 内存请求,单位为MiB、GiB,容器启动时初始化可用数量
spec.restartPolicy String 定义Pod的重启策略,可选值为Always、OnFailure,默认值为Always。 1.Always:Pod一旦终止运行,则无论容器时如何终止的,kubelet服务都将重启它。 2.OnFailure:只有Pod以非零退出码终止时,kubelet才会重启该容器。如果容器正常结束(退出码为O),则kubelet将不会重启它。 3.Never:Pod终止后,kubelet将退出码报告给Master,不会重启该Pod。
spec.nodeSelector Object 定义NodeLabel过滤标签,以key:value格式指定。
spec.imagePullSecrets Object 定义pul镜像时使用secret-名称,以name:secretkey格式指定。
spec.hostNetwork Boolean 定义是否使用主机网络模式,默认值为false。设置true表示使用宿主机网络,不使用docker网桥,同时设置了true将无法在同一台宿主机上自动第二个副本。
举例说明
  • 创建一个namespace

    复制代码
     apiVersion: v1
     kind: Namespace
     metadata:
       name: test
  • 创建一个Pod

    复制代码
     apiVersion: v1
     kind: Pod
     metadata:
       name: pod1
     spec:
       containers:
       - name: nginx-containers
         images: nginx:latest

K8s集群Namespace(命名空间)

Namespace介绍

  • 命名空间

  • 作用:多租户情况下,实现资源隔离

  • 属于逻辑隔离

  • 属于管理边界

  • 不属于网络边界

  • 可以针对每个namespace做资源配额

查看Namespace

复制代码
 命令
 [root@master1 ~]kubectl get namespace
复制代码
 说明
 default用户创建的pod默认在此命名空间
 kube-pub1ic 所有用户均可以访问,包括未认证用户
 kube-node-lease kubernetes集群节点租约状态v1,13加入
 kube-system kubernetes集群在使用

创建Namespace

通过kubectl命令行创建
复制代码
 命令
 [root@master1 ~]kubectl create namespace test
复制代码
 命令
 [root@master1 ~]kubectl get namespace
通过kubectl命令应用资源清单文件创建
复制代码
 准备资源清单文件
 [root@master1 yamldir]#cat 01-create-ns.yaml
 ​
 输出
 apiversion:v1
 kind:Namespace
 metadata:
   name:demons1
复制代码
 命令
 应用资源清单文件
 [root@master1 yamldir]kubectl apply -f 01-create-ns.yaml
复制代码
 命令
 [root@master1 yamldir]kubectl get namespace

删除Namespace

删除命名空间时,命名空间中包含的所有资源对象同时被删除

通过kubectl命令行删除
复制代码
 命令
 查看namespace
 [root@master1 yamldir]kubectl get namespace
复制代码
 命令
 kubectl命令行删除
 [root@master1 yamldir]kubectl delete namespace test1
资源清单删除
复制代码
 命令
 应用资源清单文件
 [root@master1 yamldir]kubectl delete -f 01-create-ns.yaml

k8s集群核心概念 Pod

Pod介绍

  • Pod是kubernetes集群能够调度的最小单元

  • Pod是容器的封装

查看Pod

复制代码
 命令及输出
 查看default命名空间中的Pod
 [root@master1 ~]kubectl get pod
 No resources found.
 或
 [root@master1 ~]kubectl get pods
 No resources found.
 或
 [root@master1 ~]kubectl get pods --namespace default
 No resources found.
 或
 [root@master1 ~]kubectl get pod --namespace default
 No resources found.

创建Pod

由于网络原因,建议提前准备好容器镜像。本次使用nginx:latest容器镜像

编写用于创建Pod资源清单文件

复制代码
 [root@masterl yamldir]#cat 02-create-pod.yaml
 apiVersion: v1
 kind:Pod
 metadata:
   name: pod1
 spec:
   containers:
   - name: ngninx-pod
     image: nginx:latest
     ports:
     - name: nginxport
       containerPort: 80
复制代码
 命令
 应用资源清单文件
 [root@master1 yamldir]kubectl apply -f 02-create-pod.yaml -n default[命名空间]

验证Pod是否创建

复制代码
 命令
 查看default命名空间中的Pod
 [root@master1 ~]kubectl get pods
复制代码
 命令
 查看pod更加详细信息
 [root@master1 ~]kubectl get pods -o wide

Pod访问

复制代码
 命令
 [root@master1 ~]curl http://IP

删除Pod

可通过命令行删除,也可通过资源清单(YAML)文件删除

kubectl命令行删除
复制代码
 命令
 查看default命名空间中的Pod
 [root@master1 ~]kubectl delete pods pod1
资源清单文件删除
复制代码
 命令
 查看default命名空间中的Pod
 [root@master1 ~]kubectl delete -f 02-create-pod.yaml

k8s集群核心概念Controller(控制器)

Controller介绍

  • 控制器

  • 用于对应用运行的资源对象进行监控

  • 当Pod出现问题时,会把Pod重新拉起,以达到用户的期望状态

Controller分类

常见Pod控制器:

控制器名称 作用
Deployment 声明式更新控制器,用于发布无状态应用
ReplicaSet 副本集控制器,用于对Pod进行副本规模扩大或剪裁
StatefulSet 有状态副本集,用于发布有状态应用
DaemonSet 在k8s集群每一个Node上运行一个副本,用于发布监控或日志收集类等应用
Job 运行一次性作业任务
CronJob 运行周期性作业任务

Deployment控制器介绍

  • 具有上线部署、滚动升级、创建副本、回滚到以前某一个版本(成功/稳定)等功能

  • Deployment包含ReplicaSet,除非需要自定义升级功能或者根本不需要升级Pod,否则还是建议使用Deployment而不直接使用ReplicaSet

创建Deployment控制器类型应用

通过kubectl命令行创建
复制代码
 命令
 [root@masterl1 ~]kubect1 run nginx-app --image=nginx:latest --image-pull-policy=IfNotPresent --replicas=2
复制代码
 说明
 nginx-app是deployment控制器类型的应用名称
 ​
 nginx:latest是应用运行的Pod中的Container所使用的镜像
 ​
 IfNotPresent是Container容器镜像下载策略,如果本地有镜像,使用本地,如果本地没有镜像,下载镜像
 ​
 --rep1icas=2是指应用运行的Pod共计2个副本,这是用户的期望值,
 Deployment控制器中的Replicaset控料器会一直监控此应用运行的Pod副本状态,如果数量达不到用户期望,就会重新拉起一个新的Pod,会让Pod数量一直维持在用户期望值数量。
复制代码
 命令
 查看Deployment:控制器类型应用
 [root@master1 ~]kubectl get deployment.apps
复制代码
 命令
 [root@master1 ~]kubectl get replicaset.apps
复制代码
 命令
 [root@master1 ~]kubectl get pods -o wide
通过资源清单文件创建
复制代码
 [root@master1 -]cat 03-creat-deployment-app.yaml
 apiVersion: apps/v1
 kind: Deployment
 metadata:
   name: nginx-apps
   labels:
     app: nginx
 spec:
   replicas: 1 #副本数
   selector:
   matchLabels:
     app: nginx
   template:
     metadata:
       labels:
         app: nginx
       spec:
         containers:
         - name: nginxapp
           image: nginx:latest
           imagePullPolicy: IfNotPresent
           ports:
           - containerPort: 80
复制代码
 命令
 kubectl apply -f 03-create-deployment-nginx-app2.yaml

删除Deployment控制器类型应用

带有控制器的Pod不能随便删除,如果必须删除,请删除控制器类型的应用名称

通过kubectl命令行删除

带有控制器的Pod不能删除会被重新启动

复制代码
 命令
 [root@master1 ~]kubectl get deployment.apps
复制代码
 命令
 [root@master1 ~]kubectl delete deployment.apps nginx-app
通过资源清单文件删除
复制代码
 命令
 kubectl delete -f 03-create-deployment-nginx-app2.yaml

k8s集群核心概念Service

发现一个问题,由于Pod的状态不是人为控制的Pod IP是在创建时分配 的,如果在Pod被误删除,被Controller重新拉起一个新的Pod时,我们发现Pod IP地址是变化着的,我们如果访问必须更换P地址,这样对于大量的Pod运行应用来说,我们对Pod完全无法控制的,因此在k8s集群中我们引入另一个概念Service。

Service介绍

  • 不是实体服务

  • 是一条iptables或ipvs的转发规则

Service作用

  • 通过Service为pod客户端提供访问pod方法,即客户端访问pod入口

  • Service通过Pod标签与Pod进行关联

Service类型

  • ClusterlP

    • 默认,分配一个集群内部可以访问的虚拟P
  • NodePort

    • 在每个Node上分配一个端口作为外部访问入口
  • LoadBalancer

    • 工作在特定的Cloud Provider.上,例如Google Cloud,AWS,OpenStack
  • ExternalName

    • 表示把集群外部的服务引入到集群内部中来,即实现了集群内部印od和集群外部的服务进行通信

Service参数

  • port 访问service使用的端口

  • targetPort Pod中容器端口

  • NodePort 通过Node实现外网用户访问k8s集群内service(30000-32767)

Service创建

通过命令行创建

默认创建Service为ClusterlP:类型

创建Deployment
复制代码
 命令
 ​
 [rootamaster1 ~]kubectl run nginx-app --image=nginx:latest
 -image-pull-policy=IfNotPresent --replicas=1
创建Service与Deployment类型应用关联
复制代码
 命令
 创建service
 [root@master1 ~]kubectl expose deployment.apps nginx-app -
 type=clusterIP --target-port=80--port=80
复制代码
 说明
 expose 创建service
 deployment.apps 控制器类型
 nginx-app 应用名称,也是service名称
 --type=ClusterIP 指定service类型
 --target-port=80 指定Pod中容器端口
 --port=80指定service端口
访问Servicel以实现访问Pod目的
复制代码
 命令
 查看Service创建情况
 [root@master1~]# kubectl get service
复制代码
 命令
 访问Service
 [root@master1~]# curl http://ClusterlP
通过资源清单文件Yaml创建
复制代码
 命令
 kubectl apply -f 03-create-deployment-service-clusterip.yaml

验证资源对象创建结果

检验一下service负载均衡的效果

基于资源清单YAML文件创建NodePort类型Service

执行命令

效果

可以进行外部访问

删除Service

通过命令行删除
复制代码
 命令
 查看Service创建情况
 [root@master1~]# kubectl get service
复制代码
 命令
 查看Service创建情况
 [root@master1~]# kubectl delete service nginx-app1
通过资源清单文件删除
相关推荐
Json____1 小时前
基于 Spring Boot + Vue3 的校园自习室座位预约系统实战
java·管理系统·it学习·wwwoop.com
计算机毕设定制辅导-无忧学长1 小时前
《基于Java的旧物回收管理系统设计与实现》
java·开发语言
彧azz1 小时前
Java学习语法篇:键盘录入
java·笔记·学习
xcl09251 小时前
24小时自助健身房系统开发:从架构设计到落地实践
java·spring boot
焦虑的说说2 小时前
jvm专题
java
ruleslol2 小时前
System Prompt(系统提示词) 的用法
java·ai
user_admin_god2 小时前
第 03 篇:Java HttpClient 手写第一个 Chat 请求
java·人工智能·spring boot·语言模型
西峰u2 小时前
Java多线程从入门到线程安全
java·开发语言·jvm
gis开发之家2 小时前
Spring Boot 4 定时任务与异步线程池:从 @Scheduled 到高并发任务编排(生产级实战)
java·spring boot·后端·wpf·spring boot4