Kubernetes

第一章 kubernetes

1.1 应用部署方式演变

- 传统部署时代:
早期,各机构是在物理服务器上运行应用程序。 由于无法限制在物理服务器中运行的应用程序资源使用,因此会导致资源分配问题。 例如,如果在物理服务器上运行多个应用程序, 则可能会出现一个应用程序占用大部分资源的情况,而导致其他应用程序的性能下降。 一种解决方案是将每个应用程序都运行在不同的物理服务器上, 但是当某个应用程式资源利用率不高时,剩余资源无法被分配给其他应用程式, 而且维护许多物理服务器的成本很高。
- 虚拟化部署时代:
因此,虚拟化技术被引入了。虚拟化技术允许你在单个物理服务器的 CPU 上运行多台虚拟机(VM)。 虚拟化能使应用程序在不同 VM 之间被彼此隔离,且能提供一定程度的安全性, 因为一个应用程序的信息不能被另一应用程序随意访问。
虚拟化技术能够更好地利用物理服务器的资源,并且因为可轻松地添加或更新应用程序, 而因此可以具有更高的可伸缩性,以及降低硬件成本等等的好处。
每个 VM 是一台完整的计算机,在虚拟化硬件之上运行所有组件,包括其自己的操作系统(OS
- 容器部署时代:
容器类似于 VM,但是更宽松的隔离特性使容器之间可以共享操作系统(OS)。 因此,容器比起 VM 被认为是更轻量级的。且与 VM 类似,每个容器都具有自己的文件系统、CPU、内存、进程空间等。 由于它们与基础架构分离,因此可以跨云和 OS 发行版本进行移植。
在这里插入图片描述
容器的横向扩缩容,容器容灾?
容器编排软件
Swarm Docker容器编排工具
Mesos Apache的资源统一管理的工具,需要Marathon结合使用
Kubernetes Googles开源的的容器编排工具

1.2 kubernetes简介

在这里插入图片描述

kubetnetes, 是一个全新的基于容器技术的分布式解决方案。谷歌运行了十几年的–Borg系统的一个开源版本,于2014年9月发布第一个版本,2015年7月发布第一个正式版本。
Kubernetes 的本质是一组服务器集群,它可以在集群的每个节点上运行特定程序,来对节点的容器进行管理
它的目的是实现资源管理的自动化,提供以下功能。

  • 自我修复
  • 弹性收缩
  • 服务发现
  • 负载均
  • 版本回退
  • 存储编排

1.3 kubernetes组件

一个Kubernetes集群主要是由控制节点(master)、工作节点(node)构成,每个节点上都会有安装不同的组件。
master:集群的控制平面,负责集群的决策。

Apiserver : 资源操作的唯一入口,接收用户的输入命令,提供认证、授权、API注册和发现等级制。
Scheduler: 负责集群资源调度,按照预定的调度策略将Pod调度到相应的node节点上。
ControllerManager: 负责维护集群状态,比如程序部署安排、故障检测、自动扩展、滚动更新等。
Etcd : 负责存储集群中各种资源对象信息。

node:集群的数据平面,负责为容器提供运行环境。

Kuberlet : 负责维护容器的生命周期,即通过控制docker,来创建、更新、销毁容器。
KubeProxy : 负责提供集群内部的服务器发现和负载均衡。
Docker: 负责节点上容器的各种操作。
在这里插入图片描述
以部署一个Nginx说明Kubernetes系统各种组件调用关系

  • Kubernetes环境启动后,master和node都会将自身的信息存储到etcd 数据库中。
  • 一个Nginx服务的安装请求,首先发送到 master节点的 apiServer 组件。
  • apiServer 组件会调用schedule组件来决定应该把这个服务安装到哪个node节点上,此时它会从etcd 中读取各个node节点的信息,然后 按照一定的算法进行选择,并将结果告知apiServer。
  • apiServer 调用controller-manger去调度Node节点安装Nginx服务。
  • Kubernetes接收到指令后,会通知docker,然后由docker来启动一个Nginx的Pod,Pod是Kubernetes的最小操作单元,容器必须跑在pod中。
  • 一个Nginx就运行了,如果需要访问Nginx,就需要通过kube-proxy 来对pod产生访问的代理,外界用户就可以访问集群中的Nginx服务了。

1.4 kubernetes概念

Master: 集群控制节点,每个集群至少需要一个master节点负责集群的管控。
Node: 工作负载节点,由master分配容器到node工作节点上,然后node节点上的docker负责容器的运行。
Pod: Kubernetes的最小控制单元,容器都是运行在pod中的,一个pod中可以有1个或者多个容器。
controller:控制器,通过它实现对pod的管理,比如启动pod、停止pod、伸缩pod的数量等等。
Service: pod对外服务的统一入口,下面可以维护着同一类的多个pod。
Label : 标签,用于pod进行分类,同一类pod回拥有相同的标签。
Namespace:命名空间,用来隔离pod的运行环境。
在这里插入图片描述

第二章 集群环境搭建

2.1环境规划

2.1.1集群类型

Kubernetes集群分为两类:一主多从 、多主多从。

  • 一主多从:一台master节点和多台node节点,搭建简单,有单机故障。适合用于测试环境。
  • 多主多从: 多台master节点和多台node节点,搭建麻烦,安全性高,适合用于生产环境。
    在这里插入图片描述

2.1.2安装方式

Kubernetes有多种部署方式,目前有kubeadm、minkube、二进制包。

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

2.1.3主机规划

作用IP地址操作系统配置
Master192.168.68.100centos2颗 2G内存 50G硬盘
Node1192.168.68.101centos2颗 2G内存 50G硬盘
Node2192.168.68.102centos2颗 2G内存 50G硬盘

2.2环境搭建

三台linux系统(一主二从),内置Centos7.5 系统每台linux分别安装docker、Kubeadm、kubelet、kubectl程序。
2.2.1 主机安装
1 安装虚拟机过程中注意下面的设置:
操作系统 :CPU(2颗) 内存(2G) 硬盘(50G)
2 语言选择: 中文简体

K8s集群安装
一、环境准备
1.检查操作系统的版本(推荐使用7.5以上的版本)
cat /etc/redhat-release
[root@master ~]# cat /etc/redhat-release
Rocky Linux release 8.6 (Green Obsidian)
2.主机名的解析
为了方便后面集群节点间的直接调用,在/etc/hosts文件添加下面信息
192.168.208.10 master
192.168.208.11 node1
192.168.208.12 node2
验证:
ping master node1 node2
[root@master ~]# ping master
PING master (192.168.208.10) 56(84) bytes of data.
64 bytes from master (192.168.208.10): icmp_seq=1 ttl=64 time=0.983 ms
64 bytes from master (192.168.208.10): icmp_seq=2 ttl=64 time=0.040 ms
64 bytes from master (192.168.208.10): icmp_seq=3 ttl=64 time=0.041 ms
c64 bytes from master (192.168.208.10): icmp_seq=4 ttl=64 time=0.045 ms
64 bytes from master (192.168.208.10): icmp_seq=5 ttl=64 time=0.041 ms
3.时间同步
kubernetes要求集群中的节点时间必须精确一致,这里直接使用chronyd服务从网络同步时间
#启动chronyd服务
systemctl start chronyd
#设置chronyd服务开机启动
systemctl enable chronyd
验证
使用date命令查看时间是否同步了,结果一致

  1. 禁用iptables和firewalld服务
    kubernetes和docker在运行中会产生大量的iptables规则,为了不让系统规则和他们混淆,直接关闭系统的防火墙
    #关闭firewalld服务
    systemctl stop firewalld
    #禁止firewalld服务开机启动
    systemctl disable firewalld

#关闭iptables服务
systemctl stop iptables
#禁止iptables服务开机启动
systemctl disable iptables
5. 禁用selinux
selinux是linux系统的一个安全服务,不关闭会产生各种各样的问题
编辑/etc/selinux/config文件,修改SELINUX的值为disabled,修改后重启linux服务
[root@master ~]# more /etc/selinux/config
This file controls the state of SELinux on the system.
SELINUX= can take one of these three values:
enforcing - SELinux security policy is enforced.
permissive - SELinux prints warnings instead of enforcing.
disabled - No SELinux policy is loaded.
SELINUX=disabled
SELINUXTYPE= can take one of these three values:
targeted - Targeted processes are protected,
minimum - Modification of targeted policy. Only selected processes are protected.
mls - Multi Level Security protection.
SELINUXTYPE=targeted
验证 getenforce
6.禁用swap分区
swapoff -a
vim /etc/fstab
#/etc/fstab
#Created by anaconda on Wed Jun 29 23:00:06 2022

#Accessible filesystems, by reference, are maintained under ‘/dev/disk/’.
#See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.

#After editing this file, run ‘systemctl daemon-reload’ to update systemd
#units generated from this file.

/dev/mapper/rl-root / xfs defaults 0 0
UUID=5fcb08a7-01d6-4b9a-955d-4f11642515d4 /boot xfs defaults 0 0
#/dev/mapper/rl-swap none swap defaults 0 0
7.修改linux内核参数
编辑/etc/sysctl.d/kubernetes.conf文件,添加如下配置
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip.forward = 1
重新加载配置
sysctl -p
加载网桥过滤模块
modprobe br_netfilter
查看网桥过滤模块是否加载成功
lsmod | grep br_netfilter
[root@master ~]# lsmod | grep br_netfilter
br_netfilter 24576 0
bridge 278528 1 br_netfilter
8. 配置ipvs功能
在kubernetes中service有两种代理模型,一种是基于iptables的,一种是基于ipvs的,两者比较的话,ipvs性能明显要高一些,但是如果要使用它,需要手动载入ipvs模块
安装ipset和ipvsadm
1 yum install ipset ipvsadmin -y
#如果提示No package ipvsadmin available.需要使用
yum install ipvsadm
2 添加需要加载的模块写入脚本文件 /etc/sysconfig/modules/ipvs.modules
modprobe – ip_vs
modprobe – ip_vs_rr
modprobe – ip_vs_wrr
modprobe – ip_vs_sh
modprobe – nf_conntrack
[root@master ~]# yum install ipset ipvsadmin -y
2.1添加需要加载的模块写入脚本文件
[root@master ~]# cat < /etc/sysconfig/modules/ipvs.modules
#!/bin/bash
modprobe – ip_vs
modprobe – ip_vs_rr
modprobe – ip_vs_wrr
modprobe – ip_vs_sh
modprobe – nf_conntrack
EOF

添加脚本执行文件执行权限
chmod +x /etc/sysconfig/modules/ipvs.modules
执行脚本
/bin/bash /etc/sysconfig/modules/ipvs.modules
验证模块加载是否成功
lsmod | grep -e ip_vs -e nf_conntrack_ipv4
[root@master ~]# lsmod | grep -e ip_vs -e nf_conntrack_ipv4
ip_vs_sh 16384 0
ip_vs_wrr 16384 0
ip_vs_rr 16384 0
ip_vs 172032 6 ip_vs_rr,ip_vs_sh,ip_vs_wrr
nf_conntrack 172032 6 xt_conntrack,nf_nat,ipt_MASQUERADE,xt_nat,nf_conntrack_netlink,ip_vs
nf_defrag_ipv6 20480 2 nf_conntrack,ip_vs
libcrc32c 16384 5 nf_conntrack,nf_nat,nf_tables,xfs,ip_vs
9.重启服务
reboot init 6
10.查看配置是否生效
selinux 和 swap 是否都已经禁用
#查看selinux状态
getenforce
#查看内存使用情况
free -m
二、组件安装(docker、kubeadm、kubelet、kubectl)
1.docker安装
#切换镜像源
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
#查看当前镜像中支持的docker版本
yum list docker-ce --showduplicates
#安装指定版本的docker-ce
yum install --setopt=obsoletes=0 docker-ce-18.06.3.ce-3.el7 -y
#添加docker的配置文件 /etc/docker/daemon.json
{
“exec-opts” : [“native.cgroupdriver=systemd”],
“registry-mirrors”: [“https://k1ktap5m.mirror.aliyuncs.com”]
}
#启动docker
systemctl start docker
#设置docker开机自启
systemctl enable docker
2.安装k8s组件
#切换国内镜像源
#编辑/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
#安装kubeadm、kubelet、kubectl
yum install --setopt=obsoletes=0 kubeadm-1.17.4-0 kubelet-1.17.4-0 kubectl-1.17.4-0 -y
#配置kubelet的cgroup
#编辑/etc/sysconfig/kubelet,添加如下配置
KUBELET_CGROUP_ARGS=“–cgroup-driver=systemd”
KUBE_PROXY_MODE=“ipvs”

#设置开机自启
systemctl enable kubelet
3.准备集群镜像
3.1 查看所需镜像名称和版本
kubeadm config images list
[root@master ~]# kubeadm config images list
I0703 05:04:26.218241 141570 version.go:251] remote version is much newer: v1.24.2; falling back to: stable-1.17
W0703 05:04:27.333366 141570 validation.go:28] Cannot validate kube-proxy config - no validator is available
W0703 05:04:27.333383 141570 validation.go:28] Cannot validate kubelet config - no validator is available
k8s.gcr.io/kube-apiserver:v1.17.17
k8s.gcr.io/kube-controller-manager:v1.17.17
k8s.gcr.io/kube-scheduler:v1.17.17
k8s.gcr.io/kube-proxy:v1.17.17
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.4.3-0
k8s.gcr.io/coredns:1.6.5
3.2 由于网络原因,需要先从阿里云镜像仓库中下载镜像然后重新命名镜像名称
1 定义变量
images=(
k8s.gcr.io/kube-apiserver:v1.17.17
k8s.gcr.io/kube-controller-manager:v1.17.17
k8s.gcr.io/kube-scheduler:v1.17.17
k8s.gcr.io/kube-proxy:v1.17.17
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.4.3-0
k8s.gcr.io/coredns:1.6.5
2 阿里镜像下载,改标签 删除源镜像名
for imageName in i m a g e s [ @ ] ; d o d o c k e r p u l l r e g i s t r y . c n − h a n g z h o u . a l i y u n c s . c o m / g o o g l e c o n t a i n e r s / {images[@]} ; do docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/ images[@];dodockerpullregistry.cnhangzhou.aliyuncs.com/googlecontainers/imageName
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/ i m a g e N a m e k 8 s . g c r . i o / imageName k8s.gcr.io/ imageNamek8s.gcr.io/imageName
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
don
3 验证 docker images
[root@master ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
rancher/mirrored-flannelcni-flannel v0.18.1 e237e8506509 3 weeks ago 62.3MB
rancher/mirrored-flannelcni-flannel-cni-plugin v1.1.0 fcecffc7ad4a 6 weeks ago 8.09MB
k8s.gcr.io/kube-proxy v1.17.4 6dec7cfde1e5 2 years ago 116MB
k8s.gcr.io/kube-controller-manager v1.17.4 7f997fcf3e94 2 years ago 161MB
k8s.gcr.io/kube-apiserver v1.17.4 2e1ba57fe95a 2 years ago 171MB
k8s.gcr.io/kube-scheduler v1.17.4 5db16c1c7aff 2 years ago 94.4MB
k8s.gcr.io/coredns 1.6.5 70f311871ae1 2 years ago 41.6MB
k8s.gcr.io/etcd 3.4.3-0 303ce5db0e90 2 years ago 288MB
k8s.gcr.io/pause 3.1 da86e6ba6ca1 4 years ago 742kB
4 集群初始化(只在master节点执行)
–apiserver-advertise-address 的值为你的master节点的ip地址
kubeadm init --kubernetes-version=v1.17.4
–pod-network-cidr=10.244.0.0/16
–service-cidr=10.96.0.0/12
–apiserver-advertise-address=192.168.208.10
验证: 完成后给出如下提示
[root@master ~]# kubeadm init --kubernetes-version=v1.17.4 \

–pod-network-cidr=10.244.0.0/16
–service-cidr=10.96.0.0/12
–apiserver-advertise-address=192.168.208.10
[init] Using Kubernetes version: v1.17.4
[preflight] Running pre-flight checks
[addons] Applied essential addon: CoreDNS
[addons] Applied essential addon: kube-proxy

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown ( i d − u ) : (id -u): (idu):(id -g) $HOME/.kube/config

You should now deploy a pod network to the cluster.
Run “kubectl apply -f [podnetwork].yaml” with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.208.10:6443 --token mhyzyl.ioh1urk66khi4e55
–discovery-token-ca-cert-hash sha256:b6ad9f953326967a7cebbe928188ef7859ec452f9d8edbf30cde11091ab358bd
4.1 创建必要文件
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown ( i d − u ) : (id -u): (idu):(id -g) $HOME/.kube/config
4.2 将node节点加入到集群中(根据提示到node节点执行命令)

kubeadm join 192.168.208.10:6443 --token mhyzyl.ioh1urk66khi4e55
–discovery-token-ca-cert-hash sha256:b6ad9f953326967a7cebbe928188ef7859ec452f9d8edbf30cde11091ab358bd

4.3 网络插件的安装 flannel (只需在master节点执行)
#获取flannel
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
#使用配置文件启动flannel
kubectl apply -f kube-flannel.yml

4.4 查看集群状态
[root@master ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
master Ready master 5h7m v1.17.4
node1 Ready 5h v1.17.4
node2 Ready 5h1m v1.17.4

三 台都是ready状态表示成功
#如果长时间为NotReady 状态,需要修改/var/lib/kubelet/kubeadm-flags.env,删除 --network-plugin=cni
vim /var/lib/kubelet/kubeadm-flags.env
#重新启动
systemctl daemon-reload
systemctl restart kubelet
查看所有pod的状态

[root@master ~]# kubectl  get pods --all-namespaces
NAMESPACE     NAME                             READY   STATUS    RESTARTS   AGE
default       nginx-6867cdf567-qll56           1/1     Running   0          4h52m
kube-system   coredns-6955765f44-gqp8p         1/1     Running   0          5h10m
kube-system   coredns-6955765f44-jbn6p         1/1     Running   0          5h10m
kube-system   etcd-master                      1/1     Running   0          5h10m
kube-system   kube-apiserver-master            1/1     Running   0          5h10m
kube-system   kube-controller-manager-master   1/1     Running   0          5h10m
kube-system   kube-flannel-ds-5zd7x            1/1     Running   0          5h
kube-system   kube-flannel-ds-czpwl            1/1     Running   0          5h
kube-system   kube-flannel-ds-qkr9x            1/1     Running   0          5h
kube-system   kube-proxy-9wvb6                 1/1     Running   0          5h10m
kube-system   kube-proxy-d2x7k                 1/1     Running   0          5h4m
kube-system   kube-proxy-rknzq                 1/1     Running   0          5h5m
kube-system   kube-scheduler-master            1/1     Running   0          5h10m

第三章 资源管理

3.3 资源管理方式介绍

**#命令式对象管理**  简单    临时查看
kubectl run nignx-pod --image=nginx:1.17.1  --port =80
**#命令式对象配置**: 审计 跟踪  配置文件多 
kubectl create/path  -f  nginx -pod.yanml
**#声明试对象配置**:支持目录   难测试
kubectl apply -f nignx-pos.yaml

3.3.1 命令式对象管理
kubectl 命令
kubectl【command】 【type】【name】 [flage]
kubectl get pod
command 指定对资源的操作 create 、 get、 delete
type 指定资源类型 deplment 、pod 、 sevice
name 指定资源的名称 大小写敏感
flags 指定额外的可选参数
#查看所有pod
kubectl get pod
#查看某个pod
kubectl get pod_name
#查看某个pod,以yaml格式展示结果
kubectl get pod pod_name -o yaml
资源类型
kubercetes 中所有的内容都抽象为资源
kubctl api-resources
#查看详细信息
kubectl get pod nginx-pod-pod名 -o wide/json/yaml
基础命令
create edit get patch delete explain
运行调试
run expose describle logs attach exec cp rollout scale autoscale
高级命令
apply label
创建namespace
kubectl cretae namespace dev
获取namespace
kubectl get ns
在namespace下创建并运行一个nginx 的pod
kubectl run pod --image=nginx:1.17.1 -n dev
查看新建的pod
kubectl get pod -n dev
删除指定的pod
kubectl delete pod pod_name
声明试文件创建(资源存在更新 不存在为创建)
kubectl apply -f nginxpod.yaml
vim nginxpod.yaml

apiVersion: v1
kind: Namespace
metadata:
  name: dev

---
apiVersion: v1
kind: Pod
metadata:
  name: nginxpod
  namespace: dev
spec:
  containers:
  - name: nginx-containers
    image: nginx:1.17.5

第四章 实战入门

Namespace

  • 资源配额
  • 多资源隔离或多租户隔离(逻辑隔离)
[root@master ~]# kubectl  get namespace
NAME              STATUS   AGE
default           Active   8d 未指定namespace 默认分配
kube-node-lease   Active   8d 节点之间的心跳维护
kube-public       Active   8d 可被所有用户访问 (包括未认证用户)
kube-system       Active   8d kubernetes系统创建创建的资源

查看指定namespace

[root@master ~]# kubectl get ns default 
NAME      STATUS   AGE
default   Active   8d

指定输出格式

[root@master ~]# kubectl get ns default -o yaml
apiVersion: v1
kind: Namespace
metadata:
  creationTimestamp: "2022-07-03T04:11:53Z"
  name: default
  resourceVersion: "146"
  selfLink: /api/v1/namespaces/default
  uid: 76a6d0b1-ad18-49f8-ac3b-d0d40b8ab1d8
spec:
  finalizers:
  - kubernetes
status:
  phase: Active

查看详情

[root@master ~]# kubectl describe ns default
Name:         default
Labels:       <none>
Annotations:  <none>
Status:       Active

No resource quota.

No LimitRange resource.

创建

[root@master ~]# kubectl create ns dev 
namespace/dev created

删除

[root@master ~]# kubectl delete ns dev 
namespace "dev" deleted

配置方式

vim  ns-dev.yaml 
[root@master ~]# kubectl create -f ns-dev.yaml 
namespace/dev created
配置删除
[root@master ~]# kubectl delete  -f ns-dev.yaml 
namespace "dev" deleted

Pod

Pod 根容器
在这里插入图片描述
创建并运行

[root@master ~]# kubectl  run nginx --image=nginx:1.17.1 --port=80 --namespace=dev 
kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
deployment.apps/nginx created
[root@master ~]# kubectl  get pod -n dev
NAME                     READY   STATUS    RESTARTS   AGE
nginx-64777cd554-ns92d   1/1     Running   0          46s
[root@master ~]# kubectl  get pod -n dev -o wide
NAME                     READY   STATUS    RESTARTS   AGE   IP            NODE    NOMINATED NODE   READINESS GATES
nginx-64777cd554-ns92d   1/1     Running   0          74s   10.244.2.10   node1   <none>           <none>
[root@master ~]# kubectl  describe  pod nginx-64777cd554-ns92d  -n dev 
Name:         nginx-64777cd554-ns92d
Namespace:    dev
Priority:     0
Node:         node1/192.168.208.11
Start Time:   Mon, 11 Jul 2022 05:19:14 -0400
Labels:       pod-template-hash=64777cd554
              run=nginx
Annotations:  <none>
Status:       Running
IP:           10.244.2.10
IPs:
  IP:           10.244.2.10
Controlled By:  ReplicaSet/nginx-64777cd554
Containers:
  nginx:
    Container ID:   docker://48f9a1619e27530eb27250515131d549117924cb8d7e8b5438fe5c0b641a800c
    Image:          nginx:1.17.1
    Image ID:       docker-pullable://nginx@sha256:b4b9b3eee194703fc2fa8afa5b7510c77ae70cfba567af1376a573a967c03dbb
    Port:           80/TCP
    Host Port:      0/TCP
    State:          Running
      Started:      Mon, 11 Jul 2022 05:19:16 -0400
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-pnj4l (ro)
Conditions:
  Type              Status
  Initialized       True 
  Ready             True 
  ContainersReady   True 
  PodScheduled      True 
Volumes:
  default-token-pnj4l:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-pnj4l
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  3m8s  default-scheduler  Successfully assigned dev/nginx-64777cd554-ns92d to node1
  Normal  Pulled     3m7s  kubelet, node1     Container image "nginx:1.17.1" already present on machine
  Normal  Created    3m6s  kubelet, node1     Created container nginx
  Normal  Started    3m6s  kubelet, node1     Started container nginx

访问Pod

[root@master ~]# kubectl get pod -n dev -o wide 
NAME                     READY   STATUS    RESTARTS   AGE   IP            NODE    NOMINATED NODE   READINESS GATES
nginx-64777cd554-ns92d   1/1     Running   0          68m   10.244.2.10   node1   <none>           <none>
[root@master ~]# curl 10.244.2.10:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

Pod 的删除

[root@master ~]# kubectl get pod -n dev
NAME                     READY   STATUS    RESTARTS   AGE
nginx-64777cd554-ns92d   1/1     Running   0          69m
[root@master ~]# kubectl delete pod nginx-64777cd554-ns92d -n dev 
pod "nginx-64777cd554-ns92d" deleted
查看控制器
[root@master ~]# kubectl  get deploy -n dev
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   1/1     1            1           71m
删除控制器
[root@master ~]# kubectl  delete deployment  nginx -n dev 
deployment.apps "nginx" deleted

配置操作
创建一个vim pod-nginx.yaml

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 在资源上添加标识 用来进行区分和选择
特点

  • key value 键值对附加到各个对象上
  • 一资源可以定义任意数量Label 同一label添加任意数量的资源上去
  • 资源定义时定义 创建后在定义

常用标签
版本标签 “version”:“release”
环境标签 “environment”:“dev”
架构标签 “tier”:“frontend”

标签定义完毕 还要用到标签选择 Label selector

  • Label 给资源对象定义标识
  • Label Selector 用于查询和筛选拥有标识的资源对象

基于等式的Label Selector
name = slave (包含label key = "name"且 value=‘slave’)
env != production (选择包含label中的key=‘env’ 且 value不等于“production的对象”
基于集合的Label Selector
name in (master ,slave) 选择包含label的key=“name” 且 values=‘master’ 或slave
name not in (frontend ), env !=production 选择包含label的key=“name” 且 value不等于frontend
多个标签以逗号分割

#查看pod标签
[root@master ~]# kubectl get pod -n dev --show-labels
NAME    READY   STATUS    RESTARTS   AGE   LABELS
nginx   1/1     Running   0          41s   <none>
#给pod大标签
[root@master ~]# kubectl label pod nginx -n dev version=1.0
pod/nginx labeled
打多标签
[root@master ~]# kubectl label pod nginx -n dev tier=back
pod/nginx labeled
[root@master ~]# kubectl get pod -n dev --show-labels
NAME    READY   STATUS    RESTARTS   AGE     LABELS
nginx   1/1     Running   0          4m34s   tier=back,version=1.0
#标签更新
[root@master ~]# kubectl label pod nginx -n dev version=2.0
pod/nginx labeled
[root@master ~]# kubectl label pod nginx -n dev version=2.0
error: 'version' already has a value (1.0), and --overwrite is false
[root@master ~]# kubectl label pod nginx -n dev version=2.0 --overwrite
pod/nginx labeled
标签选择器 selector
[root@master ~]# kubectl  get pod -l "version=2.0" -n dev --show-labels
NAME    READY   STATUS    RESTARTS   AGE   LABELS
nginx   1/1     Running   0          10m   tier=back,version=2.0
删除标签
[root@master ~]# kubectl label pod nginx -n dev tier-
pod/nginx labeled

配置方式 vim pod-nginx.yaml

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
[root@master ~]# kubectl apply -f pod-nginx.yaml 
Warning: kubectl apply should be used on resource created by either kubectl create --save-config or kubectl apply
pod/nginx configured

Deployment

  • k8s 很少直接控制pod 一般通过pod控制器来完成
  • pod控制器用于pod的 - 管理 确保pod资源符合预期状态
  • 当pod的资源出现故障时 会尝试重启或重建
    在这里插入图片描述
#命令操作
[root@master ~]# kubectl run nginx --image=nginx:1.17.1 --port=80 --replicas=
3 --namespace=dev
kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
deployment.apps/nginx created
[root@master ~]# kubectl get pods ,deployment -n dev
NAME                     READY   STATUS    RESTARTS   AGE
nginx-64777cd554-6vrmb   1/1     Running   0          19s
nginx-64777cd554-m6djx   1/1     Running   0          19s
nginx-64777cd554-qmxwz   1/1     Running   0          19s
NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx   3/3     3            3           66s
#查看控制器详细信息
[root@master ~]# kubectl describe deploy nginx  -n dev 
Name:                   nginx
Namespace:              dev
CreationTimestamp:      Mon, 11 Jul 2022 09:38:29 -0400
Labels:                 run=nginx
Annotations:            deployment.kubernetes.io/revision: 1
Selector:               run=nginx
Replicas:               3 desired | 3 updated | 3 total | 3 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
 Labels:  run=nginx
 Containers:
  nginx:
   Image:        nginx:1.17.1
   Port:         80/TCP
   Host Port:    0/TCP
   Environment:  <none>
   Mounts:       <none>
 Volumes:        <none>
Conditions:
 Type           Status  Reason
 ----           ------  ------
 Available      True    MinimumReplicasAvailable
 Progressing    True    NewReplicaSetAvailable
OldReplicaSets:  <none>
NewReplicaSet:   nginx-64777cd554 (3/3 replicas created)
Events:
 Type    Reason             Age    From                   Message
 ----    ------             ----   ----                   -------
 Normal  ScalingReplicaSet  2m39s  deployment-controller  Scaled up replica set nginx-64777cd554 to 3
#删除控制器
 [root@master ~]# kubectl  delete deploy nginx -n dev 
deployment.apps "nginx" deleted

#配置操作

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

Service

每个Pod都会分配一个单独的IP 存在问题

  • Pod IP 会随着Pod的重建产生变化
  • Pod IP 仅仅是集群内可见的虚拟IP,外部无法访问
    Service可以看做是一组Pod对外的访问接口。借助Service,应用可以方便实现服务发现和负载均衡
    在这里插入图片描述创建集群内部可访问的service
[root@master ~]# kubectl  expose deploy nginx --name=svc-nginx1 --type=ClusterIP --port=80 --target-port=80 -n dev 
service/svc-nginx1 exposed
#查看service的IP
[root@master ~]# kubectl get svc -n dev 
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
svc-nginx1   ClusterIP   10.103.83.141   <none>        80/TCP    32s

创建集群外部可以访问的Service

- ClusterIP 集群内部可访问的Service
-  NodePort 集群外部访问的Service
 [root@master ~]# kubectl  expose deploy nginx --name=svc-nginx2 --type=NodePort --port=80 --target-port=80 -n dev 
service/svc-nginx2 exposed
#删除Service 
[root@master ~]# kubectl get svc -n dev 
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
svc-nginx1   ClusterIP   10.103.83.141   <none>        80/TCP         13m
svc-nginx2   NodePort    10.98.139.197   <none>        80:30849/TCP   7m37s
[root@master ~]# kubectl delete svc svc-nginx1 -n dev 
service "svc-nginx1" deleted
[root@master ~]# kubectl get svc -n dev 
NAME         TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
svc-nginx2   NodePort   10.98.139.197   <none>        80:30849/TCP   8m4s
[root@master ~]# kubectl delete svc svc-nginx2 -n dev 
service "svc-nginx2" deleted
[root@master ~]# kubectl get svc -n dev 
No resources found in dev namespace.

配置方式

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 
---
  [root@master ~]# kubectl create -f svc-nginx.yaml 
service/svc-nginx created
---
[root@master ~]# kubectl delete -f svc-nginx.yaml 
service "svc-nginx" deleted

第五章 Pod详解

Pod介绍

Pod结构

在这里插入图片描述
每个pod中都可以包含一个或多个容器,这些容器分两类

  • 用户程序所在的容器,数量可多可少
  • Pause容器, 这是每个Pod都会有一个根容器,作用有两个
    可以以它为依据,评估整个Pod的健康状态
    可以在容器上设置IP 地址,其他容器都比ip (Pod IP),已实现Pod的网络通信
    这里是Pod内部通信采用的虚拟二层网络技术实现, 当前用的的是Flannel

Pod定义

Pod的资源清单


apiVersion: v1                 #必选版本号,  
kind: Pod                      #必选,资源类型
metadata:                      #必选,元数据
  name:                        #必选,Pod名称
  namespace:                   #Pod所属的命名空间,默认值为“default”
  labels:                      #自定义标签列表
    -  name: string            #ng
spec:                          #必选,Pod中容器的详细定义
    containers:                #必选,Pod中容器列表    
    -  name: string            #必选,容器名称
       images: string          #必选,容器的镜像名
       imagesPullPolicy:       #Always|Never|IFNotPresent] #获取镜像的策略
       command: [string]       #容器的启动命令列表,如不指定,食用打包时使用的启动命令
       args:  [string]         #容器的启动命令参数列表
       workingDir: srting      #容器的工作目录     
       volumeMounts:           #挂在到容器内部的储存卷配置
       - name: string          #引用pod定义的共享存储的名称,需要volume[] 部分定义的卷名
         mountPath: string     #储存卷在容器内mount的绝对路径,应少于512字符  
         readOnly: boolean     #是否为只读模式
       ports:                  #需要暴露的端口库号列表
       - name: srting          #端口的名称
         containerPort: int    #容器需要监控的端口号      
         hostPort:  int        #容器所在主机需要监听的端口号,默认与container相同  
         protocol:  string     #端口协议,支持TCP UDP 默认TCP
       env:                    #容器运行前需要设置的环境变量列表
       -  name: string         #环境变量名称
          value: string        #环境变量的值
       resources:              #资源限制和请求的设置
         limits:               #资源限制的设置
         cpu: string           #cpu的限制,单位为core数,将用于docker run --cpu-share的参数
         memory: string        #内存限制,单位可以Mib/Gib,将用于docker run --memory参数
       requests:               #资源请求的设置
         cpu: string           #CPU请求,容器启动的初始可用数
         memory: string        #     #内存请求,容器启动的初始可用数
       lifecycle:              #生命周期钩子
         postStart:            #容器启动后立即执行钩子,如果执行失败,会根据重启策略进行重启
         preStop:              #容器终止前执行次钩子,无论结果如何,容器都会终止
       livenessProbe:          #对pod内各容器将康检查的设置,当探测无响应几次以后自动重启该容器
         exec:                 #对容器内检查方式设置exec方式
           command: [string]   #exec方式需要指定的命令或脚本
         httpGet:              #对pod内个容器健康检查方法设置HttpGet,需要制定Path port 
           path: string        #
           port: number        #
           host: string        #
           scheme: string      #
           HttpHeaders:        #
           - name: string      ##
             value: string     #
          tcpSocket:           #
             port: number      #
          initialDelaySeconds: #0
          timeoutSeconds: 0    #
          successTheshold: 0   #
          securityContext:     #
            privileged: false  #
          restartPolicy:       # `[Always|Never|OnFailure]` Pod的重启策略
          nodeNameL: <string>  #设置NodeName表示将该Pod调度到指定名称的node上
          nodeSelector: obeject #  设置NodeSelector 表示将该Pod调度到包含label的node上                      
       imagePullSecrets:       #Pull镜像时使用的secret名称,以key:secretkey格式指定
       - name: string          #
       hostNetwork: false      #是否使用主机网络模式,默认为false,如果设置为true,表示使用宿主机网络
       volumes:                #该Pod上定义共享存储卷列表
       - name: string          #共享储存卷名称 (volumes)类型很多种
         emptyDir: {}          #类型为emptyDir的存储卷,与Pod同生命周期的一个临时目录。为空值
         hostPath: string      #类型为hostPath的储存卷,表示挂载Pod所在宿主机的目录
           path: string        #pod所在宿主机的目录,将被用于同期中mount的目录
          secret:              #类型为secret的存储卷,挂载集群与定义的secret对象内部
            scretname: string  #
            items:             #
            - key: string      #
              path: string     #
          configMap:           #类型为configMap的储存卷,挂载预定义的config对象到容器内部
            name: string       #
            items:             #
            - key: string      #
              path:string     #   

查看 一级资源 . 二级.三级

kubectl explain 资源类型
kubectl explain pod 
kubectl explain pod .metadata.   

kuberneted 一级属性

kubernetes中所有资源的一级属性都是一样的,主要包含5部分

  • apiVersion <string> #版本,由kubernetes内部定义,版本号必须可以用kubectl api-version 查询的到
  • kind <string> #类型,由kubernetes内部定义,版本必须可以用kubectl api-resources查询得到
  • metadata <object> #元数据,主要是资源标识和说明,常用的有name、namespace、label 等
  • spec <Object> #描述,这里配置中最重要的一部分,里面是对各种资源的详细描述
  • status <Object> #状态信息,里面的内容不需要定义,由kubernetes自动生成

spec属性

spec 重要属性
- contains <object>       #容器列表,用于定义容器的详细信息
- nodeName <string>       #根据nodeName的值将pod调度到指定的Node上
- nodeSelector <map[]>    #根据NodeSelector中定义的信息将该Pod调度到包含这些label的node上
- hostNetwork <boolean>   #是否使用主机网络模式,默认为false,如果设置为true,表示使用主机网络
- volumes <object>        #存储卷,用于定义Pod上面挂载的储存信息
- restartPolicy <string>  #重启策略,表示Pod在遇到故障的时候的处理策略

Pod配置

pod.spec.containers 属性, pod配置中最为关键的一项设置

[root@master ~]# kuberctl  explain pod.spec.containers
KIND:            Pod
VERSION:     v1
RESOURCE: containers <object>   #数组,代表可以有多个容器
FIELDS:         
     name                    <string>          #容器名称
     images                  <string>         #容器需要的镜像地址
     imagePullPolicy     <string>        #容器拉取镜像策略
     command               <[]string>     #容器的启动命令列表,如不指定,使用打包时使用的启动命令
     args                        <[]string>      #容器的启动命令需要的参数列表
     env                          <[]object>     #容器环境变量的配置
     ports                        <[]object>    #容器需要暴露的端口号列表
     resources                 <[]object>   #资源限制和资源请求的设置

进本配置

创建pod-base.yaml文件

apiVersion: v1
kind:  Pod
metadata: 
     name: pod-base
     namespace: dev
     labels: 
        user: heima 
 spec:
     containers:
     -   name: nginx
          image: nginx:1.17.1
     -   name: busybox
         image: busybox:1.30

上面定义了一个比较简单Pod的配置,里面有两个容器

  • Nginx 1.17.1版本镜像创建
  • busybox 用1.30.版本的busybox创建(busybox 是一个小巧的Linux命令集合)
    创建Pod
[root@master ~]#  kubectl  apply  -f   pod-base.yaml
pod/pod-base  create


### 镜像拉取
### 启动命令
### 环境变量
### 端口设置
### 资源配额
## Pod生命周期
### 创建和终止
### 初始化容器
### 钩子函数
### 容器探测
### 重启策略
## Pod调度
### 定向调度
### 亲和性调度
### 污点和容忍度

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值