master:集群的掌握平面,卖力集群的决策 ( 管理 )
ApiServer : 资源操作的唯一入口,吸收用户输入的命令,供应认证、授权、API注册和创造等机制
Scheduler : 卖力集群资源调度,按照预定的调度策略将Pod调度到相应的node节点上

ControllerManager : 卖力掩护集群的状态,比如程序支配安排、故障检测、自动扩展、滚动更新等
Etcd :卖力存储集群中各种资源工具的信息
node:集群的数据平面,卖力为容器供应运行环境 ( 干活 )
Kubelet : 卖力掩护容器的生命周期,即通过掌握docker,来创建、更新、销毁容器
KubeProxy : 卖力供应集群内部的做事创造和负载均衡
Docker : 卖力节点上容器的各种操作
下面,以支配一个nginx做事来解释kubernetes系统各个组件调用关系:
首先要明确,一旦kubernetes环境启动之后,master和node都会将自身的信息存储到etcd数据库中一个nginx做事的安装要求会首先被发送到master节点的apiServer组件apiServer组件会调用scheduler组件来决定到底该当把这个做事安装到哪个node节点上在此时,它会从etcd中读取各个node节点的信息,然后按照一定的算法进行选择,并将结果奉告apiServerapiServer调用controller-manager去调度Node节点安装nginx做事kubelet吸收到指令后,会关照docker,然后由docker来启动一个nginx的podpod是kubernetes的最小操作单元,容器必须跑在pod中至此,一个nginx做事就运行了,如果须要访问nginx,就须要通过kube-proxy来对pod产生访问的代理这样,外界用户就可以访问集群中的nginx做事了
核心观点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的运行环境
环境搭建主机准备本次搭建的是一台Master节点和多台Node节点构成的集群
浸染
IP地址
操作系统
配置
Master
192.168.109.101
Centos7.5 根本举动步伐做事器
2颗CPU 2G内存 50G硬盘
Node1
192.168.109.102
Centos7.5 根本举动步伐做事器
2颗CPU 2G内存 50G硬盘
Node2
192.168.109.103
Centos7.5 根本举动步伐做事器
2颗CPU 2G内存 50G硬盘
环境初始化1) 检讨操作系统的版本
# 此办法下安装kubernetes集群哀求Centos版本要在7.5或之上[root@master ~]# cat /etc/redhat-releaseCentOS Linux release 7.5.1804 (Core)
2) 主机名解析
为了方便后面集群节点间的直接调用,在这配置一下主机名解析,企业中推举利用内部DNS做事器
# 主机名成解析 编辑三台做事器的/etc/hosts文件,添加下面内容192.168.109.100 master192.168.109.101 node1192.168.109.102 node2
3) 韶光同步
kubernetes哀求集群中的节点韶光必须精确同等,这里直策应用chronyd做事从网络同步韶光。
企业中建议配置内部的韶光同步做事器
# 启动chronyd做事[root@master ~]# systemctl start chronyd# 设置chronyd做事开机自启[root@master ~]# systemctl enable chronyd# chronyd做事启动稍等几秒钟,就可以利用date命令验证韶光了[root@master ~]# date
4) 禁用iptables和firewalld做事
kubernetes和docker在运行中会产生大量的iptables规则,为了不让系统规则跟它们稠浊,直接关闭系统的规则
# 1 关闭firewalld做事[root@master ~]# systemctl stop firewalld[root@master ~]# systemctl disable firewalld# 2 关闭iptables做事[root@master ~]# systemctl stop iptables[root@master ~]# systemctl disable iptables
5) 禁用selinux
selinux是linux系统下的一个安全做事,如果不关闭它,在安装集群中会产生各种各样的奇葩问题
# 编辑 /etc/selinux/config 文件,修正SELINUX的值为disabled# 把稳修正完毕之后须要重启linux做事SELINUX=disabled
6) 禁用swap分区
swap分区指的是虚拟内存分区,它的浸染是在物理内存利用完之后,将磁盘空间虚拟成内存来利用
启用swap设备会对系统的性能产生非常负面的影响,因此kubernetes哀求每个节点都要禁用swap设备
但是如果由于某些缘故原由确实不能关闭swap分区,就须要在集群安装过程中通过明确的参数进行配置解释
# 编辑分区配置文件/etc/fstab,注释掉swap分区一行# 把稳修正完毕之后须要重启linux做事 UUID=455cc753-7a60-4c17-a424-7741728c44a1 /boot xfs defaults 0 0 /dev/mapper/centos-home /home xfs defaults 0 0# /dev/mapper/centos-swap swap swap defaults 0 0
7)修正linux的内核参数
# 修正linux的内核参数,添加网桥过滤和地址转发功能# 编辑/etc/sysctl.d/kubernetes.conf文件,添加如下配置:net.bridge.bridge-nf-call-ip6tables = 1net.bridge.bridge-nf-call-iptables = 1net.ipv4.ip_forward = 1# 重新加载配置[root@master ~]# sysctl -p# 加载网桥过滤模块[root@master ~]# modprobe br_netfilter# 查看网桥过滤模块是否加载成功[root@master ~]# lsmod | grep br_netfilter
8)配置ipvs功能
在kubernetes中service有两种代理模型,一种是基于iptables的,一种是基于ipvs的
两者比较的话,ipvs的性能明显要高一些,但是如果要利用它,须要手动载入ipvs模块
# 1 安装ipset和ipvsadm[root@master ~]# yum install ipset ipvsadmin -y# 2 添加须要加载的模块写入脚本文件[root@master ~]# cat <<EOF > /etc/sysconfig/modules/ipvs.modules#!/bin/bashmodprobe -- ip_vsmodprobe -- ip_vs_rrmodprobe -- ip_vs_wrrmodprobe -- ip_vs_shmodprobe -- nf_conntrack_ipv4EOF# 3 为脚本文件添加实行权限[root@master ~]# chmod +x /etc/sysconfig/modules/ipvs.modules# 4 实行脚本文件[root@master ~]# /bin/bash /etc/sysconfig/modules/ipvs.modules# 5 查看对应的模块是否加载成功[root@master ~]# lsmod | grep -e ip_vs -e nf_conntrack_ipv4
9) 重启做事器
上面步骤完成之后,须要重新启动linux系统
[root@master ~]# reboot
安装docker
# 1 切换镜像源[root@master ~]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo# 2 查看当前镜像源中支持的docker版本[root@master ~]# yum list docker-ce --showduplicates# 3 安装特定版本的docker-ce# 必须指定--setopt=obsoletes=0,否则yum会自动安装更高版本[root@master ~]# yum install --setopt=obsoletes=0 docker-ce-18.06.3.ce-3.el7 -y# 4 添加一个配置文件# Docker在默认情形下利用的Cgroup Driver为cgroupfs,而kubernetes推举利用systemd来代替cgroupfs[root@master ~]# mkdir /etc/docker[root@master ~]# cat <<EOF > /etc/docker/daemon.json{ "exec-opts": ["native.cgroupdriver=systemd"], "registry-mirrors": ["https://kn0t2bca.mirror.aliyuncs.com"]}EOF# 5 启动docker[root@master ~]# systemctl restart docker[root@master ~]# systemctl enable docker# 6 检讨docker状态和版本[root@master ~]# docker version
安装k8s
# 由于kubernetes的镜像源在国外,速率比较慢,这里切换成海内的镜像源# 编辑/etc/yum.repos.d/kubernetes.repo,添加下面的配置 [kubernetes]name=Kubernetesbaseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64enabled=1gpgcheck=0repo_gpgcheck=0gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg# 安装kubeadm、kubelet和kubectl[root@master ~]# 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"# 4 设置kubelet开机自启[root@master ~]# systemctl enable kubelet
准备集群镜像
# 在安装kubernetes集群之前,必须要提前准备好集群须要的镜像,所需镜像可以通过下面命令查看[root@master ~]# kubeadm config images list# 下载镜像# 此镜像在kubernetes的仓库中,由于网络缘故原由,无法连接,下面供应了一种替代方案images=( kube-apiserver:v1.17.4 kube-controller-manager:v1.17.4 kube-scheduler:v1.17.4 kube-proxy:v1.17.4 pause:3.1 etcd:3.4.3-0 coredns:1.6.5)for imageName in ${images[@]} ; dodocker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageNamedocker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageNamedocker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$imageNamedone
集群初始化
下面开始对集群进行初始化,并将node节点加入到集群中
下面的操作只须要在master节点上实行即可
# 创建集群[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.109.100# 创建必要文件[root@master ~]# mkdir -p $HOME/.kube[root@master ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config[root@master ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
下面的操作只须要在node节点上实行即可
# 将node节点加入集群[root@master ~]# kubeadm join 192.168.109.100:6443 \ --token 8507uc.o0knircuri8etnw2 \--discovery-token-ca-cert-hash \sha256:acc37967fb5b0acf39d7598f8a439cc7dc88f439a3f4d0c9cae88e7901b9d3f# 查看集群状态 此时的集群状态为NotReady,这是由于还没有配置网络插件[root@master ~]# kubectl get nodesNAME STATUS ROLES AGE VERSIONmaster NotReady master 6m43s v1.17.4node1 NotReady <none> 22s v1.17.4node2 NotReady <none> 19s v1.17.4
安装网络插件
kubernetes支持多种网络插件,比如flannel、calico、canal等等,任选一种利用即可,本次选择flannel
下面操作依旧只在master节点实行即可,插件利用的是DaemonSet的掌握器,它会在每个节点上都运行
# 获取fannel的配置文件[root@master ~]# wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml# 修正文件中quay.io仓库为quay-mirror.qiniu.com# 利用配置文件启动fannel[root@master ~]# kubectl apply -f kube-flannel.yml# 稍等少焉,再次查看集群节点的状态[root@master ~]# kubectl get nodesNAME STATUS ROLES AGE VERSIONmaster Ready master 15m v1.17.4node1 Ready <none> 8m53s v1.17.4node2 Ready <none> 8m50s v1.17.4
至此,kubernetes的集议论况搭建完成
做事支配接下来在kubernetes集群中支配一个nginx程序,测试下集群是否在正常事情。
# 支配nginx[root@master ~]# kubectl create deployment nginx --image=nginx:1.14-alpine# 暴露端口[root@master ~]# kubectl expose deployment nginx --port=80 --type=NodePort# 查看做事状态[root@master ~]# kubectl get pods,serviceNAME READY STATUS RESTARTS AGEpod/nginx-86c57db685-fdc2k 1/1 Running 0 18mNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEservice/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 82mservice/nginx NodePort 10.104.121.45 <none> 80:30073/TCP 17m# 4 末了在电脑上访问下支配的nginx做事
资源管理
在kubernetes中,所有的内容都抽象为资源,用户须要通过操作资源来管理kubernetes。
kubernetes的实质上便是一个集群系统,用户可以在集群中支配各种做事,也便是在kubernetes集群中运行一个个的容器,并将指定的程序跑在容器中。
kubernetes的最小管理单元是pod而不是容器,以是只能将容器放在Pod中,而kubernetes一样平常也不会直接管理Pod,而是通过Pod掌握器来管理Pod的。
Pod可以供应做事之后,就要考虑如何访问Pod中做事,kubernetes供应了Service资源实现这个功能。
k8s供应了三种资源管理办法
命令式工具管理:直策应用命令去操作kubernetes资源kubectl run nginx-pod --image=nginx:1.17.1 --port=80命令式工具配置:通过命令配置和配置文件去操作kubernetes资源kubectl create/patch -f nginx-pod.yaml声明式工具配置:通过apply命令和配置文件去操作kubernetes资源kubectl apply -f nginx-pod.yaml命令式工具管理kubectl命令
kubectl是kubernetes集群的命令行工具,通过它能够对集群本身进行管理,并能够在集群上进行容器化运用的安装支配。kubectl命令的语法如下:
kubectl [command] [type] [name] [flags]
comand:指定要对资源实行的操作,例如create、get、delete
type:指定资源类型,比如deployment、pod、service
name:指定资源的名称,名称大小写敏感
flags:指定额外的可选参数
# 查看所有podkubectl get pod # 查看某个podkubectl get pod pod_name# 查看某个pod,以yaml格式展示结果kubectl get pod pod_name -o yaml
下面以一个namespace / pod的创建和删除大略演示下命令的利用:
# 创建一个namespace[root@master ~]# kubectl create namespace devnamespace/dev created# 获取namespace[root@master ~]# kubectl get nsNAME STATUS AGEdefault Active 21hdev Active 21skube-node-lease Active 21hkube-public Active 21hkube-system Active 21h# 在此namespace下创建并运行一个nginx的Pod[root@master ~]# kubectl run pod --image=nginx -n devkubectl 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/pod created# 查看新创建的pod[root@master ~]# kubectl get pod -n devNAME READY STATUS RESTARTS AGEpod-864f9875b9-pcw7x 1/1 Running 0 21s# 删除指定的pod[root@master ~]# kubectl delete pod pod-864f9875b9-pcw7xpod "pod-864f9875b9-pcw7x" deleted# 删除指定的namespace[root@master ~]# kubectl delete ns devnamespace "dev" deleted
命令式工具配置
命令式工具配置便是利用命令合营配置文件一起来操作kubernetes资源。
1) 创建一个nginxpod.yaml,内容如下:
apiVersion: v1kind: Namespacemetadata: name: dev---apiVersion: v1kind: Podmetadata: name: nginxpod namespace: devspec: containers: - name: nginx-containers image: nginx:1.17.1
2)实行create命令,创建资源:
[root@master ~]# kubectl create -f nginxpod.yamlnamespace/dev createdpod/nginxpod created
此时创造创建了两个资源工具,分别是namespace和pod
3)实行get命令,查看资源:
[root@master ~]# kubectl get -f nginxpod.yamlNAME STATUS AGEnamespace/dev Active 18sNAME READY STATUS RESTARTS AGEpod/nginxpod 1/1 Running 0 17s
这样就显示了两个资源工具的信息
4)实行delete命令,删除资源:
[root@master ~]# kubectl delete -f nginxpod.yamlnamespace "dev" deletedpod "nginxpod" deleted
此时创造两个资源工具被删除了
总结:命令式工具配置的办法操作资源,可以大略的认为:命令 + yaml配置文件(里面是命令须要的各种参数)
声明式工具配置
声明式工具配置跟命令式工具配置很相似,但是它只有一个命令apply。
# 首先实行一次kubectl apply -f yaml文件,创造创建了资源[root@master ~]# kubectl apply -f nginxpod.yamlnamespace/dev createdpod/nginxpod created# 再次实行一次kubectl apply -f yaml文件,创造说资源没有变动[root@master ~]# kubectl apply -f nginxpod.yamlnamespace/dev unchangedpod/nginxpod unchanged
实战
本章节将先容如何在kubernetes集群中支配一个nginx做事,并且能够对其进行访问。
NamespaceNamespace是kubernetes系统中的一种非常主要资源,它的紧张浸染是用来实现多套环境的资源隔离或者多租户的资源隔离。
默认情形下,kubernetes集群中的所有的Pod都是可以相互访问的。但是在实际中,可能不想让两个Pod之间进行相互的访问,那此时就可以将两个Pod划分到不同的namespace下。kubernetes通过将集群内部的资源分配到不同的Namespace中,可以形成逻辑上的"组",以方便不同的组的资源进行隔离利用和管理。
可以通过kubernetes的授权机制,将不同的namespace交给不同租户进行管理,这样就实现了多租户的资源隔离。此时还能结合kubernetes的资源配额机制,限定不同租户能占用的资源,例如CPU利用量、内存利用量等等,来实现租户可用资源的管理。
kubernetes在集群启动之后,会默认创建几个namespace
[root@master ~]# kubectl get namespaceNAME STATUS AGEdefault Active 45h # 所有未指定Namespace的工具都会被分配在default命名空间kube-node-lease Active 45h # 集群节点之间的心跳掩护,v1.13开始引入kube-public Active 45h # 此命名空间下的资源可以被所有人访问(包括未认证用户)kube-system Active 45h # 所有由Kubernetes系统创建的资源都处于这个命名空间
下面来看namespace资源的详细操作:
查看
# 1 查看所有的ns 命令:kubectl get ns[root@master ~]# kubectl get nsNAME STATUS AGEdefault Active 45hkube-node-lease Active 45hkube-public Active 45h kube-system Active 45h # 2 查看指定的ns 命令:kubectl get ns ns名称[root@master ~]# kubectl get ns defaultNAME STATUS AGEdefault Active 45h# 3 指定输出格式 命令:kubectl get ns ns名称 -o 格式参数# kubernetes支持的格式有很多,比较常见的是wide、json、yaml[root@master ~]# kubectl get ns default -o yamlapiVersion: v1kind: Namespacemetadata: creationTimestamp: "2020-04-05T04:44:16Z" name: default resourceVersion: "151" selfLink: /api/v1/namespaces/default uid: 7405f73a-e486-43d4-9db6-145f1409f090spec: finalizers: - kubernetesstatus: phase: Active # 4 查看ns详情 命令:kubectl describe ns ns名称[root@master ~]# kubectl describe ns defaultName: defaultLabels: <none>Annotations: <none>Status: Active # Active 命名空间正在利用中 Terminating 正在删除命名空间# ResourceQuota 针对namespace做的资源限定# LimitRange针对namespace中的每个组件做的资源限定No resource quota.No LimitRange resource.
创建
# 创建namespace[root@master ~]# kubectl create ns devnamespace/dev created
删除
# 删除namespace[root@master ~]# kubectl delete ns devnamespace "dev" deleted
配置办法
首先准备一个yaml文件:ns-dev.yaml
apiVersion: v1kind: Namespacemetadata: name: dev
然后就可以实行对应的创建和删除命令了:
创建:kubectl create -f ns-dev.yaml
删除:kubectl delete -f ns-dev.yaml
PodPod是kubernetes集群进行管理的最小单元,程序要运行必须支配在容器中,而容器必须存在于Pod中。
Pod可以认为是容器的封装,一个Pod中可以存在一个或者多个容器。
kubernetes在集群启动之后,集群中的各个组件也都因此Pod办法运行的。可以通过下面命令查看:
[root@master ~]# kubectl get pod -n kube-systemNAMESPACE NAME READY STATUS RESTARTS AGEkube-system coredns-6955765f44-68g6v 1/1 Running 0 2d1hkube-system coredns-6955765f44-cs5r8 1/1 Running 0 2d1hkube-system etcd-master 1/1 Running 0 2d1hkube-system kube-apiserver-master 1/1 Running 0 2d1hkube-system kube-controller-manager-master 1/1 Running 0 2d1hkube-system kube-flannel-ds-amd64-47r25 1/1 Running 0 2d1hkube-system kube-flannel-ds-amd64-ls5lh 1/1 Running 0 2d1hkube-system kube-proxy-685tk 1/1 Running 0 2d1hkube-system kube-proxy-87spt 1/1 Running 0 2d1hkube-system kube-scheduler-master 1/1 Running 0 2d1h
创建并运行
kubernetes没有供应单独运行Pod的命令,都是通过Pod掌握器来实现的
# 命令格式: kubectl run (pod掌握器名称) [参数] # --image 指定Pod的镜像# --port 指定端口# --namespace 指定namespace[root@master ~]# kubectl run nginx --image=nginx:1.17.1 --port=80 --namespace dev deployment.apps/nginx created
查看pod信息
# 查看Pod基本信息[root@master ~]# kubectl get pods -n devNAME READY STATUS RESTARTS AGEnginx-5ff7956ff6-fg2db 1/1 Running 0 43s# 查看Pod的详细信息[root@master ~]# kubectl describe pod nginx-5ff7956ff6-fg2db -n devName: nginx-5ff7956ff6-fg2dbNamespace: devPriority: 0Node: node1/192.168.109.101Start Time: Wed, 08 Apr 2020 09:29:24 +0800Labels: pod-template-hash=5ff7956ff6 run=nginxAnnotations: <none>Status: RunningIP: 10.244.1.23IPs: IP: 10.244.1.23Controlled By: ReplicaSet/nginx-5ff7956ff6Containers: nginx: Container ID: docker://4c62b8c0648d2512380f4ffa5da2c99d16e05634979973449c98e9b829f6253c Image: nginx:1.17.1 Image ID: docker-pullable://nginx@sha256:485b610fefec7ff6c463ced9623314a04ed67e3945b9c08d7e53a47f6d108dc7 Port: 80/TCP Host Port: 0/TCP State: Running Started: Wed, 08 Apr 2020 09:30:01 +0800 Ready: True Restart Count: 0 Environment: <none> Mounts: /var/run/secrets/kubernetes.io/serviceaccount from default-token-hwvvw (ro)Conditions: Type Status Initialized True Ready True ContainersReady True PodScheduled TrueVolumes: default-token-hwvvw: Type: Secret (a volume populated by a Secret) SecretName: default-token-hwvvw Optional: falseQoS Class: BestEffortNode-Selectors: <none>Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s node.kubernetes.io/unreachable:NoExecute for 300sEvents: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled <unknown> default-scheduler Successfully assigned dev/nginx-5ff7956ff6-fg2db to node1 Normal Pulling 4m11s kubelet, node1 Pulling image "nginx:1.17.1" Normal Pulled 3m36s kubelet, node1 Successfully pulled image "nginx:1.17.1" Normal Created 3m36s kubelet, node1 Created container nginx Normal Started 3m36s kubelet, node1 Started container nginx
访问Pod
# 获取podIP[root@master ~]# kubectl get pods -n dev -o wideNAME READY STATUS RESTARTS AGE IP NODE ... nginx-5ff7956ff6-fg2db 1/1 Running 0 190s 10.244.1.23 node1 ...#访问POD[root@master ~]# curl http://10.244.1.23:80<!DOCTYPE html><html><head><title>Welcome to nginx!</title></head><body><p><em>Thank you for using nginx.</em></p></body></html>
删除指定Pod
# 删除指定Pod[root@master ~]# kubectl delete pod nginx-5ff7956ff6-fg2db -n devpod "nginx-5ff7956ff6-fg2db" deleted# 此时,显示删除Pod成功,但是再查询,创造又新产生了一个 [root@master ~]# kubectl get pods -n devNAME READY STATUS RESTARTS AGEnginx-5ff7956ff6-jj4ng 1/1 Running 0 21s# 这是由于当前Pod是由Pod掌握器创建的,掌握器会监控Pod状况,一旦创造Pod去世亡,会立即重修# 此时要想删除Pod,必须删除Pod掌握器# 先来查询一下当前namespace下的Pod掌握器[root@master ~]# kubectl get deploy -n devNAME READY UP-TO-DATE AVAILABLE AGEnginx 1/1 1 1 9m7s# 接下来,删除此PodPod掌握器[root@master ~]# kubectl delete deploy nginx -n devdeployment.apps "nginx" deleted# 稍等少焉,再查询Pod,创造Pod被删除了[root@master ~]# kubectl get pods -n devNo resources found in dev namespace.
配置操作
创建一个pod-nginx.yaml,内容如下:
apiVersion: v1kind: Podmetadata: name: nginx namespace: devspec: containers: - image: nginx:1.17.1 name: pod ports: - name: nginx-port containerPort: 80 protocol: TCP
然后就可以实行对应的创建和删除命令了:
创建:kubectl create -f pod-nginx.yaml
删除:kubectl delete -f pod-nginx.yaml
LabelLabel是kubernetes系统中的一个主要观点。它的浸染便是在资源上添加标识,用来对它们进行区分和选择。
Label的特点:
一个Label会以key/value键值对的形式附加到各种工具上,如Node、Pod、Service等等一个资源工具可以定义任意数量的Label ,同一个Label也可以被添加到任意数量的资源工具上去Label常日在资源工具定义时确定,当然也可以在工具创建后动态添加或者删除可以通过Label实现资源的多维度分组,以便灵巧、方便地进行资源分配、调度、配置、支配等管理事情。
一些常用的Label 示例如下:
版本标签:"version":"release", "version":"stable"......
环境标签:"environment":"dev","environment":"test","environment":"pro"
架构标签:"tier":"frontend","tier":"backend"
标签定义完毕之后,还要考虑到标签的选择,这就要利用到Label Selector,即:
Label用于给某个资源工具定义标识
Label Selector用于查询和筛选拥有某些标签的资源工具
当前有两种Label Selector:
基于等式的Label Selectorname = slave: 选择所有包含Label中key="name"且value="slave"的工具env != production: 选择所有包括Label中的key="env"且value不即是"production"的工具基于凑集的Label Selectorname in (master, slave): 选择所有包含Label中的key="name"且value="master"或"slave"的工具name not in (frontend): 选择所有包含Label中的key="name"且value不即是"frontend"的工具标签的选择条件可以利用多个,此时将多个Label Selector进行组合,利用逗号","进行分隔即可。例如:
name=slave,env!=production
name not in (frontend),env!=production
命令办法
# 为pod资源打标签[root@master ~]# kubectl label pod nginx-pod version=1.0 -n devpod/nginx-pod labeled# 为pod资源更新标签[root@master ~]# kubectl label pod nginx-pod version=2.0 -n dev --overwritepod/nginx-pod labeled# 查看标签[root@master ~]# kubectl get pod nginx-pod -n dev --show-labelsNAME READY STATUS RESTARTS AGE LABELSnginx-pod 1/1 Running 0 10m version=2.0# 筛选标签[root@master ~]# kubectl get pod -n dev -l version=2.0 --show-labelsNAME READY STATUS RESTARTS AGE LABELSnginx-pod 1/1 Running 0 17m version=2.0[root@master ~]# kubectl get pod -n dev -l version!=2.0 --show-labelsNo resources found in dev namespace.#删除标签[root@master ~]# kubectl label pod nginx-pod version- -n devpod/nginx-pod labeled
配置办法
apiVersion: v1kind: Podmetadata: 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
然后就可以实行对应的更新命令了:kubectl apply -f pod-nginx.yaml
Deployment在kubernetes中,Pod是最小的掌握单元,但是kubernetes很少直接掌握Pod,一样平常都是通过Pod掌握器来完成的。Pod掌握器用于pod的管理,确保pod资源符合预期的状态,当pod的资源涌现故障时,会考试测验进行重启或重修pod。
在kubernetes中Pod掌握器的种类有很多,本章节只先容一种:Deployment。
命令操作
# 命令格式: kubectl run deployment名称 [参数] # --image 指定pod的镜像# --port 指定端口# --replicas 指定创建pod数量# --namespace 指定namespace[root@master ~]# kubectl run nginx --image=nginx:1.17.1 --port=80 --replicas=3 -n devdeployment.apps/nginx created# 查看创建的Pod[root@master ~]# kubectl get pods -n devNAME READY STATUS RESTARTS AGEnginx-5ff7956ff6-6k8cb 1/1 Running 0 19snginx-5ff7956ff6-jxfjt 1/1 Running 0 19snginx-5ff7956ff6-v6jqw 1/1 Running 0 19s# 查看deployment的信息[root@master ~]# kubectl get deploy -n devNAME READY UP-TO-DATE AVAILABLE AGEnginx 3/3 3 3 2m42s# UP-TO-DATE:成功升级的副本数量# AVAILABLE:可用副本的数量[root@master ~]# kubectl get deploy -n dev -o wideNAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTORnginx 3/3 3 3 2m51s nginx nginx:1.17.1 run=nginx# 查看deployment的详细信息[root@master ~]# kubectl describe deploy nginx -n devName: nginxNamespace: devCreationTimestamp: Wed, 08 Apr 2020 11:14:14 +0800Labels: run=nginxAnnotations: deployment.kubernetes.io/revision: 1Selector: run=nginxReplicas: 3 desired | 3 updated | 3 total | 3 available | 0 unavailableStrategyType: RollingUpdateMinReadySeconds: 0RollingUpdateStrategy: 25% max unavailable, 25% max surgePod 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 NewReplicaSetAvailableOldReplicaSets: <none>NewReplicaSet: nginx-5ff7956ff6 (3/3 replicas created)Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal ScalingReplicaSet 5m43s deployment-controller Scaled up replicaset nginx-5ff7956ff6 to 3 # 删除 [root@master ~]# kubectl delete deploy nginx -n devdeployment.apps "nginx" deleted
配置操作
创建一个deploy-nginx.yaml,内容如下:
apiVersion: apps/v1kind: Deploymentmetadata: name: nginx namespace: devspec: 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通过上节课的学习,已经能够利用Deployment来创建一组Pod来供应具有高可用性的做事。
虽然每个Pod都会分配一个单独的Pod IP,然而却存在如下两问题:
Pod IP 会随着Pod的重修产生变革Pod IP 仅仅是集群内可见的虚拟IP,外部无法访问这样对付访问这个做事带来了难度。因此,kubernetes设计了Service来办理这个问题。
Service可以看作是一组同类Pod对外的访问接口。借助Service,运用可以方便地实现做事创造和负载均衡。
操作一:创建集群内部可访问的Service
# 暴露Service[root@master ~]# kubectl expose deploy nginx --name=svc-nginx1 --type=ClusterIP --port=80 --target-port=80 -n devservice/svc-nginx1 exposed# 查看service[root@master ~]# kubectl get svc svc-nginx -n dev -o wideNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTORsvc-nginx1 ClusterIP 10.109.179.231 <none> 80/TCP 3m51s run=nginx# 这里产生了一个CLUSTER-IP,这便是service的IP,在Service的生命周期中,这个地址是不会变动的# 可以通过这个IP访问当前service对应的POD[root@master ~]# curl 10.109.179.231:80<!DOCTYPE html><html><head><title>Welcome to nginx!</title></head><body><h1>Welcome to nginx!</h1>.......</body></html>
操作二:创建集群外部也可访问的Service
# 上面创建的Service的type类型为ClusterIP,这个ip地址只用集群内部可访问# 如果须要创建外部也可以访问的Service,须要修正type为NodePort[root@master ~]# kubectl expose deploy nginx --name=svc-nginx2 --type=NodePort --port=80 --target-port=80 -n devservice/svc-nginx2 exposed# 此时查看,会创造涌现了NodePort类型的Service,而且有一对Port(80:31928/TC)[root@master ~]# kubectl get svc svc-nginx-1 -n dev -o wideNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTORsvc-nginx2 NodePort 10.100.94.0 <none> 80:31928/TCP 9s run=nginx# 接下来就可以通过集群外的主机访问 节点IP:31928访问做事了# 例如在的电脑主机上通过浏览器访问下面的地址http://192.168.109.100:31928/
删除Service
[root@master ~]# kubectl delete svc svc-nginx-1 -n dev service "svc-nginx-1" deleted
配置办法
创建一个svc-nginx.yaml,内容如下:
apiVersion: v1kind: Servicemetadata: name: svc-nginx namespace: devspec: clusterIP: 10.109.179.231 ports: - port: 80 protocol: TCP targetPort: 80 selector: run: nginx type: ClusterIP
然后就可以实行对应的创建和删除命令了:
创建:kubectl create -f svc-nginx.yaml
删除:kubectl delete -f svc-nginx.yaml
小结
至此,已经节制了Namespace、Pod、Deployment、Service资源的基本操作,有了这些操作,就可以在kubernetes集群中实现一个做事的大略支配和访问了,但是如果想要更好的利用kubernetes,就须要深入学习这几种资源的细节和事理。