当前位置: 首页 > news >正文

制作教育类网站wordpress qq注册

制作教育类网站,wordpress qq注册,商机互联做的网站和推广怎么样,简单网页制作训练概念 应用部署方式演变 在部署应用程序的方式上#xff0c;主要经历了三个时代#xff1a; 传统部署#xff1a;互联网早期#xff0c;会直接将应用程序部署在物理机上 优点#xff1a;简单#xff0c;不需要其它技术的参与 缺点#xff1a;不能为应用程序定义资源使…概念 应用部署方式演变 在部署应用程序的方式上主要经历了三个时代 传统部署互联网早期会直接将应用程序部署在物理机上 优点简单不需要其它技术的参与 缺点不能为应用程序定义资源使用边界很难合理地分配计算资源而且程序之间容易产生影响 虚拟化部署可以在一台物理机上运行多个虚拟机每个虚拟机都是独立的一个环境 优点程序环境不会相互产生影响提供了一定程度的安全性 缺点增加了操作系统浪费了部分资源 容器化部署与虚拟化类似但是共享了操作系统 优点 可以保证每个容器拥有自己的文件系统、CPU、内存、进程空间等 运行应用程序所需要的资源都被容器包装并和底层基础架构解耦 容器化的应用程序可以跨云服务商、跨Linux操作系统发行版进行部署 容器化部署方式给带来很多的便利但是也会出现一些问题比如说 一个容器故障停机了怎么样让另外一个容器立刻启动去替补停机的容器当并发访问量变大的时候怎么样做到横向扩展容器数量 这些容器管理的问题统称为容器编排问题为了解决这些容器编排问题就产生了一些容器编排的软件 SwarmDocker自己的容器编排工具MesosApache的一个资源统一管控的工具需要和Marathon结合使用KubernetesGoogle开源的的容器编排工具 kubernetes简介 kubernetes是一个全新的基于容器技术的分布式架构领先方案是谷歌严格保密十几年的秘密武器----Borg系统的一个开源版本于2014年9月发布第一个版本2015年7月发布第一个正式版本。 kubernetes的本质是一组服务器集群它可以在集群的每个节点上运行特定的程序来对节点中的容器进行管理。目的是实现资源管理的自动化主要提供了如下的主要功能 自我修复一旦某一个容器崩溃能够在1秒中左右迅速启动新的容器弹性伸缩可以根据需要自动对集群中正在运行的容器数量进行调整服务发现服务可以通过自动发现的形式找到它所依赖的服务负载均衡如果一个服务起动了多个容器能够自动实现请求的负载均衡版本回退如果发现新发布的程序版本有问题可以立即回退到原来的版本存储编排可以根据容器自身的需求自动创建存储卷 kubernetes组件 一个kubernetes集群主要是由控制节点(master)、工作节点(node)构成每个节点上都会安装不同的组件。 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服务了 kubernetes概念 Master集群控制节点每个集群需要至少一个master节点负责集群的管控Node工作负载节点由master分配容器到这些node工作节点上然后node节点上的docker负责容器的运行Podkubernetes的最小控制单元容器都是运行在pod中的一个pod中可以有1个或者多个容器Controller控制器通过它来实现对pod的管理比如启动pod、停止pod、伸缩pod的数量等等Servicepod对外服务的统一入口下面可以维护者同一类的多个podLabel标签用于对pod进行分类同一类pod会拥有相同的标签NameSpace命名空间用来隔离pod的运行环境 kubernetes集群环境搭建 前置知识点 目前生产部署Kubernetes 集群主要有两种方式 kubeadm Kubeadm 是一个K8s 部署工具提供kubeadm init 和kubeadm join用于快速部署Kubernetes 集群。 官方地址https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/ 二进制包 从github 下载发行版的二进制包手动部署每个组件组成Kubernetes 集群。 Kubeadm 降低部署门槛但屏蔽了很多细节遇到问题很难排查。如果想更容易可控推荐使用二进制包部署 Kubernetes 集群虽然手动部署麻烦点期间可以学习很多工作原理也利于后期维护。 kubeadm 部署方式介绍 kubeadm 是官方社区推出的一个用于快速部署kubernetes 集群的工具这个工具能通过两条指令完成一个kubernetes 集群的部署 创建一个Master 节点kubeadm init将Node 节点加入到当前集群中$ kubeadm join Master 节点的IP 和端口 安装要求 在开始之前部署Kubernetes 集群机器需要满足以下几个条件 一台或多台机器操作系统CentOS7.x-86_x64硬件配置2GB 或更多RAM2 个CPU 或更多CPU硬盘30GB 或更多集群中所有机器之间网络互通可以访问外网需要拉取镜像禁止swap 分区 最终目标 在所有节点上安装Docker 和kubeadm部署Kubernetes Master部署容器网络插件部署Kubernetes Node将节点加入Kubernetes 集群中部署Dashboard Web 页面可视化查看Kubernetes 资源 准备环境 角色IP地址IP地址master01192.168.5.3dockerkubectlkubeadmkubeletnode01192.168.5.4dockerkubectlkubeadmkubeletnode02192.168.5.5dockerkubectlkubeadmkubelet 环境初始化 检查操作系统的版本 # 此方式下安装kubernetes集群要求Centos版本要在7.5或之上 [rootmaster ~]# cat /etc/redhat-release Centos Linux 7.5.1804 (Core)主机名解析 为了方便集群节点间的直接调用在这个配置一下主机名解析企业中推荐使用内部DNS服务器 # 主机名成解析 编辑三台服务器的/etc/hosts文件添加下面内容 192.168.90.100 master 192.168.90.106 node1 192.168.90.107 node2时间同步 kubernetes要求集群中的节点时间必须精确一直这里使用chronyd服务从网络同步时间 企业中建议配置内部的会见同步服务器 # 启动chronyd服务 [rootmaster ~]# systemctl start chronyd [rootmaster ~]# systemctl enable chronyd [rootmaster ~]# date禁用iptable和firewalld服务 kubernetes和docker 在运行的中会产生大量的iptables规则为了不让系统规则跟它们混淆直接关闭系统的规则 # 1 关闭firewalld服务 [rootmaster ~]# systemctl stop firewalld [rootmaster ~]# systemctl disable firewalld # 2 关闭iptables服务 [rootmaster ~]# systemctl stop iptables [rootmaster ~]# systemctl disable iptables禁用selinux selinux是linux系统下的一个安全服务如果不关闭它在安装集群中会产生各种各样的奇葩问题 # 编辑 /etc/selinux/config 文件修改SELINUX的值为disable # 注意修改完毕之后需要重启linux服务 SELINUXdisabled禁用swap分区 swap分区指的是虚拟内存分区它的作用是物理内存使用完之后将磁盘空间虚拟成内存来使用启用swap设备会对系统的性能产生非常负面的影响因此kubernetes要求每个节点都要禁用swap设备但是如果因为某些原因确实不能关闭swap分区就需要在集群安装过程中通过明确的参数进行配置说明 # 编辑分区配置文件/etc/fstab注释掉swap分区一行 # 注意修改完毕之后需要重启linux服务 vim /etc/fstab 注释掉 /dev/mapper/centos-swap swap # /dev/mapper/centos-swap swap修改linux的内核参数 # 修改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# 重新加载配置 [rootmaster ~]# sysctl -p # 加载网桥过滤模块 [rootmaster ~]# modprobe br_netfilter # 查看网桥过滤模块是否加载成功 [rootmaster ~]# lsmod | grep br_netfilter2.6.8 配置ipvs功能 在Kubernetes中Service有两种带来模型一种是基于iptables的一种是基于ipvs的两者比较的话ipvs的性能明显要高一些但是如果要使用它需要手动载入ipvs模块 # 1.安装ipset和ipvsadm [rootmaster ~]# yum install ipset ipvsadm -y # 2.添加需要加载的模块写入脚本文件 [rootmaster ~]# cat EOF /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_ipv4 EOF # 3.为脚本添加执行权限 [rootmaster ~]# chmod x /etc/sysconfig/modules/ipvs.modules # 4.执行脚本文件 [rootmaster ~]# /bin/bash /etc/sysconfig/modules/ipvs.modules # 5.查看对应的模块是否加载成功 [rootmaster ~]# lsmod | grep -e ip_vs -e nf_conntrack_ipv4安装docker # 1、切换镜像源 [rootmaster ~]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo# 2、查看当前镜像源中支持的docker版本 [rootmaster ~]# yum list docker-ce --showduplicates# 3、安装特定版本的docker-ce # 必须制定--setoptobsoletes0否则yum会自动安装更高版本 [rootmaster ~]# yum install --setoptobsoletes0 docker-ce-18.06.3.ce-3.el7 -y# 4、添加一个配置文件 #Docker 在默认情况下使用Vgroup Driver为cgroupfs而Kubernetes推荐使用systemd来替代cgroupfs [rootmaster ~]# mkdir /etc/docker [rootmaster ~]# cat EOF /etc/docker/daemon.json {exec-opts: [native.cgroupdriversystemd],registry-mirrors: [https://kn0t2bca.mirror.aliyuncs.com] } EOF# 5、启动dokcer [rootmaster ~]# systemctl restart docker [rootmaster ~]# systemctl enable docker安装Kubernetes组件 # 1、由于kubernetes的镜像在国外速度比较慢这里切换成国内的镜像源 # 2、编辑/etc/yum.repos.d/kubernetes.repo,添加下面的配置 [kubernetes] nameKubernetes baseurlhttp://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 enabled1 gpgchech0 repo_gpgcheck0 gpgkeyhttp://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpghttp://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg# 3、安装kubeadm、kubelet和kubectl [rootmaster ~]# yum install --setoptobsoletes0 kubeadm-1.17.4-0 kubelet-1.17.4-0 kubectl-1.17.4-0 -y# 4、配置kubelet的cgroup #编辑/etc/sysconfig/kubelet, 添加下面的配置 KUBELET_CGROUP_ARGS--cgroup-driversystemd KUBE_PROXY_MODEipvs# 5、设置kubelet开机自启 [rootmaster ~]# systemctl enable kubelet准备集群镜像 # 在安装kubernetes集群之前必须要提前准备好集群需要的镜像所需镜像可以通过下面命令查看 [rootmaster ~]# kubeadm config images list# 下载镜像 # 此镜像kubernetes的仓库中由于网络原因无法连接下面提供了一种替换方案 images(kube-apiserver:v1.17.4kube-controller-manager:v1.17.4kube-scheduler:v1.17.4kube-proxy:v1.17.4pause:3.1etcd:3.4.3-0coredns: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/$imageName done集群初始化 下面的操作只需要在master节点上执行即可 # 创建集群 [rootmaster ~]# kubeadm init \--apiserver-advertise-address192.168.90.100 \--image-repository registry.aliyuncs.com/google_containers \--kubernetes-versionv1.17.4 \--service-cidr10.96.0.0/12 \--pod-network-cidr10.244.0.0/16 # 创建必要文件 [rootmaster ~]# mkdir -p $HOME/.kube [rootmaster ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config [rootmaster ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config下面的操作只需要在node节点上执行即可 kubeadm join 192.168.0.100:6443 --token awk15p.t6bamck54w69u4s8 \--discovery-token-ca-cert-hash sha256:a94fa09562466d32d29523ab6cff122186f1127599fa4dcd5fa0152694f17117在master上查看节点信息 [rootmaster ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION master NotReady master 6m v1.17.4 node1 NotReady none 22s v1.17.4 node2 NotReady none 19s v1.17.4安装网络插件只在master节点操作即可 wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml由于外网不好访问如果出现无法访问的情况可以直接用下面的 记得文件名是kube-flannel.yml位置/root/kube-flannel.yml内容 https://github.com/flannel-io/flannel/tree/master/Documentation/kube-flannel.yml也可手动拉取指定版本 docker pull quay.io/coreos/flannel:v0.14.0 #拉取flannel网络三台主机 docker images #查看仓库是否拉去下来 个人笔记 若是集群状态一直是 notready,用下面语句查看原因 journalctl -f -u kubelet.service若原因是 cni.go:237] Unable to update cni config: no networks found in /etc/cni/net.d mkdir -p /etc/cni/net.d #创建目录给flannel做配置文件 vim /etc/cni/net.d/10-flannel.conf #编写配置文件{name:cbr0,cniVersion:0.3.1,type:flannel,deledate:{hairpinMode:true,isDefaultGateway:true}}使用kubeadm reset重置集群 #在master节点之外的节点进行操作 kubeadm reset systemctl stop kubelet systemctl stop docker rm -rf /var/lib/cni/ rm -rf /var/lib/kubelet/* rm -rf /etc/cni/ ifconfig cni0 down ifconfig flannel.1 down ifconfig docker0 down ip link delete cni0 ip link delete flannel.1 ##重启kubelet systemctl restart kubelet ##重启docker systemctl restart docker重启kubelet和docker # 重启kubelet systemctl restart kubelet # 重启docker systemctl restart docker使用配置文件启动fannel kubectl apply -f kube-flannel.yml等待它安装完毕 发现已经是 集群的状态已经是Ready kubeadm中的命令 # 生成 新的token [rootmaster ~]# kubeadm token create --print-join-command集群测试 创建一个nginx服务 kubectl create deployment nginx --imagenginx:1.14-alpine暴露端口 kubectl expose deploy nginx --port80 --target-port80 --typeNodePort查看服务 kubectl get pod,svc查看pod 浏览器测试结果 资源管理 资源管理介绍 在kubernetes中所有的内容都抽象为资源用户需要通过操作资源来管理kubernetes。 kubernetes的本质上就是一个集群系统用户可以在集群中部署各种服务所谓的部署服务其实就是在kubernetes集群中运行一个个的容器并将指定的程序跑在容器中。 kubernetes的最小管理单元是pod而不是容器所以只能将容器放在Pod中而kubernetes一般也不会直接管理Pod而是通过Pod控制器来管理Pod的。 Pod可以提供服务之后就要考虑如何访问Pod中服务kubernetes提供了Service资源实现这个功能。 当然如果Pod中程序的数据需要持久化kubernetes还提供了各种存储系统。 学习kubernetes的核心就是学习如何对集群上的Pod、Pod控制器、Service、存储等各种资源进行操作 YAML语言介绍 YAML是一个类似 XML、JSON 的标记性语言。它强调以数据为中心并不是以标识语言为重点。因而YAML本身的定义比较简单号称一种人性化的数据格式语言。 heimaage15/ageaddressBeijing/address /heimaheima:age: 15address: BeijingYAML的语法比较简单主要有下面几个 大小写敏感使用缩进表示层级关系缩进不允许使用tab只允许空格( 低版本限制 )缩进的空格数不重要只要相同层级的元素左对齐即可#表示注释 YAML支持以下几种数据类型 纯量单个的、不可再分的值对象键值对的集合又称为映射mapping/ 哈希hash / 字典dictionary数组一组按次序排列的值又称为序列sequence / 列表list # 纯量, 就是指的一个简单的值字符串、布尔值、整数、浮点数、Null、时间、日期 # 1 布尔类型 c1: true (或者True) # 2 整型 c2: 234 # 3 浮点型 c3: 3.14 # 4 null类型 c4: ~ # 使用~表示null # 5 日期类型 c5: 2018-02-17 # 日期必须使用ISO 8601格式即yyyy-MM-dd # 6 时间类型 c6: 2018-02-17T15:02:3108:00 # 时间使用ISO 8601格式时间和日期之间使用T连接最后使用代表时区 # 7 字符串类型 c7: heima # 简单写法直接写值 , 如果字符串中间有特殊字符必须使用双引号或者单引号包裹 c8: line1line2 # 字符串过多的情况可以拆成多行每一行会被转化成一个空格对象 # 形式一(推荐): heima:age: 15address: Beijing # 形式二(了解): heima: {age: 15,address: Beijing}# 数组 # 形式一(推荐): address:- 顺义- 昌平 # 形式二(了解): address: [顺义,昌平]小提示 1 书写yaml切记: 后面要加一个空格 2 如果需要将多段yaml配置放在一个文件中中间要使用—分隔 3 下面是一个yaml转json的网站可以通过它验证yaml是否书写正确 https://www.json2yaml.com/convert-yaml-to-json 资源管理方式 命令式对象管理直接使用命令去操作kubernetes资源 kubectl run nginx-pod --imagenginx:1.17.1 --port80命令式对象配置通过命令配置和配置文件去操作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、deletetype指定资源类型比如deployment、pod、servicename指定资源的名称名称大小写敏感flags指定额外的可选参数 # 查看所有pod kubectl get pod # 查看某个pod kubectl get pod pod_name# 查看某个pod,以yaml格式展示结果 kubectl get pod pod_name -o yaml资源类型 kubernetes中所有的内容都抽象为资源可以通过下面的命令进行查看: kubectl api-resources经常使用的资源有下面这些 资源分类资源名称缩写资源作用集群级别资源nodesno集群组成部分namespacesns隔离Podpod资源podspo装载容器pod资源控制器replicationcontrollersrc控制pod资源replicasetsrs控制pod资源deploymentsdeploy控制pod资源daemonsetsds控制pod资源jobs控制pod资源cronjobscj控制pod资源horizontalpodautoscalershpa控制pod资源statefulsetssts控制pod资源服务发现资源servicessvc统一pod对外接口ingressing统一pod对外接口存储资源volumeattachments存储persistentvolumespv存储persistentvolumeclaimspvc存储配置资源configmapscm配置secrets配置 操作 kubernetes允许对资源进行多种操作可以通过–help查看详细的操作命令 kubectl --help经常使用的操作有下面这些 命令分类命令翻译命令作用基本命令create创建创建一个资源edit编辑编辑一个资源get获取获取一个资源patch更新更新一个资源delete删除删除一个资源explain解释展示资源文档运行和调试run运行在集群中运行一个指定的镜像expose暴露暴露资源为Servicedescribe描述显示资源内部信息logs日志输出容器在 pod 中的日志输出容器在 pod 中的日志attach缠绕进入运行中的容器进入运行中的容器exec执行容器中的一个命令执行容器中的一个命令cp复制在Pod内外复制文件rollout首次展示管理资源的发布scale规模扩(缩)容Pod的数量autoscale自动调整自动调整Pod的数量高级命令applyrc通过文件对资源进行配置label标签更新资源上的标签其他命令cluster-info集群信息显示集群信息version版本显示当前Server和Client的版本 下面以一个namespace / pod的创建和删除简单演示下命令的使用 # 创建一个namespace [rootmaster ~]# kubectl create namespace dev namespace/dev created# 获取namespace [rootmaster ~]# kubectl get ns NAME STATUS AGE default Active 21h dev Active 21s kube-node-lease Active 21h kube-public Active 21h kube-system Active 21h# 在此namespace下创建并运行一个nginx的Pod [rootmaster ~]# kubectl run pod --imagenginx:latest -n dev kubectl run --generatordeployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generatorrun-pod/v1 or kubectl create instead. deployment.apps/pod created# 查看新创建的pod [rootmaster ~]# kubectl get pod -n dev NAME READY STATUS RESTARTS AGE pod 1/1 Running 0 21s# 删除指定的pod [rootmaster ~]# kubectl delete pod pod-864f9875b9-pcw7x pod pod deleted# 删除指定的namespace [rootmaster ~]# kubectl delete ns dev namespace dev deleted命令式对象配置 命令式对象配置就是使用命令配合配置文件一起来操作kubernetes资源。 1 创建一个nginxpod.yaml内容如下 apiVersion: v1 kind: Namespace metadata:name: dev---apiVersion: v1 kind: Pod metadata:name: nginxpodnamespace: dev spec:containers:- name: nginx-containersimage: nginx:latest2执行create命令创建资源 [rootmaster ~]# kubectl create -f nginxpod.yaml namespace/dev created pod/nginxpod created此时发现创建了两个资源对象分别是namespace和pod 3执行get命令查看资源 [rootmaster ~]# kubectl get -f nginxpod.yaml NAME STATUS AGE namespace/dev Active 18sNAME READY STATUS RESTARTS AGE pod/nginxpod 1/1 Running 0 17s这样就显示了两个资源对象的信息 4执行delete命令删除资源 [rootmaster ~]# kubectl delete -f nginxpod.yaml namespace dev deleted pod nginxpod deleted此时发现两个资源对象被删除了 总结: 命令式对象配置的方式操作资源可以简单的认为命令 yaml配置文件里面是命令需要的各种参数 声明式对象配置 声明式对象配置跟命令式对象配置很相似但是它只有一个命令apply。 # 首先执行一次kubectl apply -f yaml文件发现创建了资源 [rootmaster ~]# kubectl apply -f nginxpod.yaml namespace/dev created pod/nginxpod created# 再次执行一次kubectl apply -f yaml文件发现说资源没有变动 [rootmaster ~]# kubectl apply -f nginxpod.yaml namespace/dev unchanged pod/nginxpod unchanged总结: 其实声明式对象配置就是使用apply描述一个资源最终的状态在yaml中定义状态 使用apply操作资源 如果资源不存在就创建相当于 kubectl create 如果资源已存在就更新相当于 kubectl patch 扩展kubectl可以在node节点上运行吗 ? kubectl的运行是需要进行配置的它的配置文件是$HOME/.kube如果想要在node节点运行此命令需要将master上的.kube文件复制到node节点上即在master节点上执行下面操作 scp -r HOME/.kube node1: HOME/使用推荐: 三种方式应该怎么用 ? 创建/更新资源 使用声明式对象配置 kubectl apply -f XXX.yaml删除资源 使用命令式对象配置 kubectl delete -f XXX.yaml查询资源 使用命令式对象管理 kubectl get(describe) 资源名称 实战入门 本章节将介绍如何在kubernetes集群中部署一个nginx服务并且能够对其进行访问。 Namespace Namespace是kubernetes系统中的一种非常重要资源它的主要作用是用来实现多套环境的资源隔离或者多租户的资源隔离。 默认情况下kubernetes集群中的所有的Pod都是可以相互访问的。但是在实际中可能不想让两个Pod之间进行互相的访问那此时就可以将两个Pod划分到不同的namespace下。kubernetes通过将集群内部的资源分配到不同的Namespace中可以形成逻辑上的组以方便不同的组的资源进行隔离使用和管理。 可以通过kubernetes的授权机制将不同的namespace交给不同租户进行管理这样就实现了多租户的资源隔离。此时还能结合kubernetes的资源配额机制限定不同租户能占用的资源例如CPU使用量、内存使用量等等来实现租户可用资源的管理。 kubernetes在集群启动之后会默认创建几个namespace [rootmaster ~]# kubectl get namespace NAME STATUS AGE default 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 [rootmaster ~]# kubectl get ns NAME STATUS AGE default Active 45h kube-node-lease Active 45h kube-public Active 45h kube-system Active 45h # 2 查看指定的ns 命令kubectl get ns ns名称 [rootmaster ~]# kubectl get ns default NAME STATUS AGE default Active 45h# 3 指定输出格式 命令kubectl get ns ns名称 -o 格式参数 # kubernetes支持的格式有很多比较常见的是wide、json、yaml [rootmaster ~]# kubectl get ns default -o yaml apiVersion: v1 kind: Namespace metadata:creationTimestamp: 2021-05-08T04:44:16Zname: defaultresourceVersion: 151selfLink: /api/v1/namespaces/defaultuid: 7405f73a-e486-43d4-9db6-145f1409f090 spec:finalizers:- kubernetes status:phase: Active# 4 查看ns详情 命令kubectl describe ns ns名称 [rootmaster ~]# kubectl describe ns default Name: default Labels: none Annotations: none Status: Active # Active 命名空间正在使用中 Terminating 正在删除命名空间# ResourceQuota 针对namespace做的资源限制 # LimitRange针对namespace中的每个组件做的资源限制 No resource quota. No LimitRange resource.创建 # 创建namespace [rootmaster ~]# kubectl create ns dev namespace/dev created删除 # 删除namespace [rootmaster ~]# kubectl delete ns dev namespace dev deleted配置方式 首先准备一个yaml文件ns-dev.yaml apiVersion: v1 kind: Namespace metadata:name: dev然后就可以执行对应的创建和删除命令了 创建kubectl create -f ns-dev.yaml 删除kubectl delete -f ns-dev.yaml Pod Pod是kubernetes集群进行管理的最小单元程序要运行必须部署在容器中而容器必须存在于Pod中。 Pod可以认为是容器的封装一个Pod中可以存在一个或者多个容器。 kubernetes在集群启动之后集群中的各个组件也都是以Pod方式运行的。可以通过下面命令查看 [rootmaster ~]# kubectl get pod -n kube-system NAMESPACE NAME READY STATUS RESTARTS AGE kube-system coredns-6955765f44-68g6v 1/1 Running 0 2d1h kube-system coredns-6955765f44-cs5r8 1/1 Running 0 2d1h kube-system etcd-master 1/1 Running 0 2d1h kube-system kube-apiserver-master 1/1 Running 0 2d1h kube-system kube-controller-manager-master 1/1 Running 0 2d1h kube-system kube-flannel-ds-amd64-47r25 1/1 Running 0 2d1h kube-system kube-flannel-ds-amd64-ls5lh 1/1 Running 0 2d1h kube-system kube-proxy-685tk 1/1 Running 0 2d1h kube-system kube-proxy-87spt 1/1 Running 0 2d1h kube-system kube-scheduler-master 1/1 Running 0 2d1h创建并运行 kubernetes没有提供单独运行Pod的命令都是通过Pod控制器来实现的 # 命令格式 kubectl run (pod控制器名称) [参数] # --image 指定Pod的镜像 # --port 指定端口 # --namespace 指定namespace [rootmaster ~]# kubectl run nginx --imagenginx:latest --port80 --namespace dev deployment.apps/nginx created查看pod信息 # 查看Pod基本信息 [rootmaster ~]# kubectl get pods -n dev NAME READY STATUS RESTARTS AGE nginx 1/1 Running 0 43s# 查看Pod的详细信息 [rootmaster ~]# kubectl describe pod nginx -n dev Name: nginx Namespace: dev Priority: 0 Node: node1/192.168.5.4 Start Time: Wed, 08 May 2021 09:29:24 0800 Labels: pod-template-hash5ff7956ff6runnginx Annotations: none Status: Running IP: 10.244.1.23 IPs:IP: 10.244.1.23 Controlled By: ReplicaSet/nginx Containers:nginx:Container ID: docker://4c62b8c0648d2512380f4ffa5da2c99d16e05634979973449c98e9b829f6253cImage: nginx:latestImage ID: docker-pullable://nginxsha256:485b610fefec7ff6c463ced9623314a04ed67e3945b9c08d7e53a47f6d108dc7Port: 80/TCPHost Port: 0/TCPState: RunningStarted: Wed, 08 May 2021 09:30:01 0800Ready: TrueRestart Count: 0Environment: noneMounts:/var/run/secrets/kubernetes.io/serviceaccount from default-token-hwvvw (ro) Conditions:Type StatusInitialized TrueReady TrueContainersReady TruePodScheduled True Volumes:default-token-hwvvw:Type: Secret (a volume populated by a Secret)SecretName: default-token-hwvvwOptional: false QoS Class: BestEffort Node-Selectors: none Tolerations: node.kubernetes.io/not-ready:NoExecute for 300snode.kubernetes.io/unreachable:NoExecute for 300s Events:Type Reason Age From Message---- ------ ---- ---- -------Normal Scheduled unknown default-scheduler Successfully assigned dev/nginx-5ff7956ff6-fg2db to node1Normal Pulling 4m11s kubelet, node1 Pulling image nginx:latestNormal Pulled 3m36s kubelet, node1 Successfully pulled image nginx:latestNormal Created 3m36s kubelet, node1 Created container nginxNormal Started 3m36s kubelet, node1 Started container nginx访问Pod # 获取podIP [rootmaster ~]# kubectl get pods -n dev -o wideapiVersion: v1 kind: Service metadata:name: service-nodeportnamespace: dev spec:selector:app: nginx-podtype: NodePort # service类型ports:- port: 80nodePort: 30002 # 指定绑定的node的端口(默认的取值范围是30000-32767), 如果不指定会默认分配targetPort: 80# 创建service [rootk8s-master01 ~]# kubectl create -f service-nodeport.yaml service/service-nodeport created# 查看service [rootk8s-master01 ~]# kubectl get svc -n dev -o wide NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) SELECTOR service-nodeport NodePort 10.105.64.191 none 80:30002/TCP appnginx-pod# 接下来可以通过电脑主机的浏览器去访问集群中任意一个nodeip的30002端口即可访问到pod删除指定Pod # 删除指定Pod [rootmaster ~]# kubectl delete pod nginx -n dev pod nginx deleted# 此时显示删除Pod成功但是再查询发现又新产生了一个 [rootmaster ~]# kubectl get pods -n dev NAME READY STATUS RESTARTS AGE nginx 1/1 Running 0 21s# 这是因为当前Pod是由Pod控制器创建的控制器会监控Pod状况一旦发现Pod死亡会立即重建 # 此时要想删除Pod必须删除Pod控制器# 先来查询一下当前namespace下的Pod控制器 [rootmaster ~]# kubectl get deploy -n dev NAME READY UP-TO-DATE AVAILABLE AGE nginx 1/1 1 1 9m7s# 接下来删除此PodPod控制器 [rootmaster ~]# kubectl delete deploy nginx -n dev deployment.apps nginx deleted# 稍等片刻再查询Pod发现Pod被删除了 [rootmaster ~]# kubectl get pods -n dev No resources found in dev namespace.配置操作 创建一个pod-nginx.yaml内容如下 apiVersion: v1 kind: Pod metadata:name: nginxnamespace: dev spec:containers:- image: nginx:latestname: podports:- name: nginx-portcontainerPort: 80protocol: TCP然后就可以执行对应的创建和删除命令了 创建kubectl create -f pod-nginx.yaml删除kubectl delete -f pod-nginx.yamlLabel Label是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 Selector name slave: 选择所有包含Label中keyname且valueslave的对象 env ! production: 选择所有包括Label中的keyenv且value不等于production的对象 基于集合的Label Selector name in (master, slave):选择所有包含Label中的keyname且valuemaster或slave的对象 name not in (frontend): 选择所有包含Label中的keyname且value不等于frontend的对象 标签的选择条件可以使用多个此时将多个Label Selector进行组合使用逗号,进行分隔即可。例如 nameslaveenv!productionname not in (frontend)env!production命令方式 # 为pod资源打标签 [rootmaster ~]# kubectl label pod nginx-pod version1.0 -n dev pod/nginx-pod labeled# 为pod资源更新标签 [rootmaster ~]# kubectl label pod nginx-pod version2.0 -n dev --overwrite pod/nginx-pod labeled# 查看标签 [rootmaster ~]# kubectl get pod nginx-pod -n dev --show-labels NAME READY STATUS RESTARTS AGE LABELS nginx-pod 1/1 Running 0 10m version2.0# 筛选标签 [rootmaster ~]# kubectl get pod -n dev -l version2.0 --show-labels NAME READY STATUS RESTARTS AGE LABELS nginx-pod 1/1 Running 0 17m version2.0 [rootmaster ~]# kubectl get pod -n dev -l version!2.0 --show-labels No resources found in dev namespace.#删除标签 [rootmaster ~]# kubectl label pod nginx-pod -n dev tier- pod/nginx unlabeled配置方式 apiVersion: v1 kind: Pod metadata:name: nginxnamespace: devlabels:version: 3.0 env: test spec:containers:- image: nginx:latestname: podports:- name: nginx-portcontainerPort: 80protocol: TCP然后就可以执行对应的更新命令了kubectl apply -f pod-nginx.yaml Deployment 在kubernetes中Pod是最小的控制单元但是kubernetes很少直接控制Pod一般都是通过Pod控制器来完成的。Pod控制器用于pod的管理确保pod资源符合预期的状态当pod的资源出现故障时会尝试进行重启或重建pod。 在kubernetes中Pod控制器的种类有很多本章节只介绍一种Deployment。 命令操作 # 命令格式: kubectl create deployment 名称 [参数] # --image 指定pod的镜像 # --port 指定端口 # --replicas 指定创建pod数量 # --namespace 指定namespace [rootmaster ~]# kubectl run nginx --imagenginx:latest --port80 --replicas3 -n dev deployment.apps/nginx created# 查看创建的Pod [rootmaster ~]# kubectl get pods -n dev NAME READY STATUS RESTARTS AGE nginx-5ff7956ff6-6k8cb 1/1 Running 0 19s nginx-5ff7956ff6-jxfjt 1/1 Running 0 19s nginx-5ff7956ff6-v6jqw 1/1 Running 0 19s# 查看deployment的信息 [rootmaster ~]# kubectl get deploy -n dev NAME READY UP-TO-DATE AVAILABLE AGE nginx 3/3 3 3 2m42s# UP-TO-DATE成功升级的副本数量 # AVAILABLE可用副本的数量 [rootmaster ~]# kubectl get deploy -n dev -o wide NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR nginx 3/3 3 3 2m51s nginx nginx:latest runnginx# 查看deployment的详细信息 [rootmaster ~]# kubectl describe deploy nginx -n dev Name: nginx Namespace: dev CreationTimestamp: Wed, 08 May 2021 11:14:14 0800 Labels: runnginx Annotations: deployment.kubernetes.io/revision: 1 Selector: runnginx Replicas: 3 desired | 3 updated | 3 total | 3 available | 0 unavailable StrategyType: RollingUpdate MinReadySeconds: 0 RollingUpdateStrategy: 25% max unavailable, 25% max 违规词汇 Pod Template:Labels: runnginxContainers:nginx:Image: nginx:latestPort: 80/TCPHost Port: 0/TCPEnvironment: noneMounts: noneVolumes: none Conditions:Type Status Reason---- ------ ------Available True MinimumReplicasAvailableProgressing True NewReplicaSetAvailable OldReplicaSets: 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# 删除 [rootmaster ~]# kubectl delete deploy nginx -n dev deployment.apps nginx deleted配置操作 创建一个deploy-nginx.yaml内容如下 apiVersion: apps/v1 kind: Deployment metadata:name: nginxnamespace: dev spec:replicas: 3selector:matchLabels:run: nginxtemplate:metadata:labels:run: nginxspec:containers:- image: nginx:latestname: nginxports:- containerPort: 80protocol: TCP然后就可以执行对应的创建和删除命令了 创建kubectl create -f deploy-nginx.yaml删除kubectl delete -f deploy-nginx.yamService 通过前面的学习已经能够利用Deployment来创建一组Pod来提供具有高可用性的服务。 虽然每个Pod都会分配一个单独的Pod IP然而却存在如下两问题 Pod IP 会随着Pod的重建产生变化Pod IP 仅仅是集群内可见的虚拟IP外部无法访问 这样对于访问这个服务带来了难度。因此kubernetes设计了Service来解决这个问题。 Service可以看作是一组同类Pod对外的访问接口。借助Service应用可以方便地实现服务发现和负载均衡。 创建集群内部可访问的Service # 暴露Service [rootmaster ~]# kubectl expose deploy nginx --namesvc-nginx1 --typeClusterIP --port80 --target-port80 -n dev service/svc-nginx1 exposed# 查看service [rootmaster ~]# kubectl get svc svc-nginx1 -n dev -o wide NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR svc-nginx1 ClusterIP 10.109.179.231 none 80/TCP 3m51s runnginx# 这里产生了一个CLUSTER-IP这就是service的IP在Service的生命周期中这个地址是不会变动的 # 可以通过这个IP访问当前service对应的POD [rootmaster ~]# curl 10.109.179.231:80 !DOCTYPE html html head titleWelcome to nginx!/title /head body h1Welcome to nginx!/h1 ....... /body /html创建集群外部也可访问的Service # 上面创建的Service的type类型为ClusterIP这个ip地址只用集群内部可访问 # 如果需要创建外部也可以访问的Service需要修改type为NodePort [rootmaster ~]# kubectl expose deploy nginx --namesvc-nginx2 --typeNodePort --port80 --target-port80 -n dev service/svc-nginx2 exposed# 此时查看会发现出现了NodePort类型的Service而且有一对Port80:31928/TC [rootmaster ~]# kubectl get svc svc-nginx2 -n dev -o wide NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR svc-nginx2 NodePort 10.100.94.0 none 80:31928/TCP 9s runnginx# 接下来就可以通过集群外的主机访问 节点IP:31928访问服务了 # 例如在的电脑主机上通过浏览器访问下面的地址 http://192.168.90.100:31928/删除Service [rootmaster ~]# kubectl delete svc svc-nginx-1 -n dev service svc-nginx-1 deleted配置方式 创建一个svc-nginx.yaml内容如下 apiVersion: v1 kind: Service metadata:name: svc-nginxnamespace: dev spec:clusterIP: 10.109.179.231 #固定svc的内网ipports:- port: 80protocol: TCPtargetPort: 80selector:run: nginxtype: ClusterIP然后就可以执行对应的创建和删除命令了 创建kubectl create -f svc-nginx.yaml删除kubectl delete -f svc-nginx.yaml总结 至此已经掌握了Namespace、Pod、Deployment、Service资源的基本操作有了这些操作就可以在kubernetes集群中实现一个服务的简单部署和访问了但是如果想要更好的使用kubernetes就需要深入学习这几种资源的细节和原理。
http://www.tj-hxxt.cn/news/141870.html

相关文章:

  • 济南做网站知识客厅装修风格
  • 网站与平台的开发区别网站帮忙备案
  • 网站开发转包协议长春哪有做网站公司
  • 重庆网站建设c中国空间站名字
  • 网站建设 迅雷下载百度搜一搜
  • 河南整站百度快照优化去哪里找做网站
  • 广州房地产网站建设方案网络营销案例分析怎么写
  • 有什么可以做兼职的正规网站深圳龙岗住房和建设局网站官网
  • 网站建设现在主要做些什么老哥们给个手机能看的2020
  • 网站的开发环境是什么柳州住房城乡建设厅官方网站
  • 2021手机能看的网站wordpress 上传
  • 域名 做网站和邮箱做网站的公司有多少家
  • 天河建设网站系统广州市建设厅网站首页
  • 简单的明星个人网站建设论文福州外贸网站建设
  • 推广一个网站周期网站打开很慢怎么做优化
  • 查排名网站推广费用一般多少
  • 湖南网站建设效果wordpress只有我可以看
  • 新建设电影院+网站江苏省住房城乡建设厅门户网站
  • wordpress怎么上传音频网站移动端优化的重点有哪些
  • 一般云主机可以做视频网站吗河南信合建设投资集团有限公司网站
  • 网站内移动的图片怎么做的上海商城网站
  • 青岛金桥建设机械有限公司网站公司网页设计制作有哪些
  • 网站开发用那个软件鸣蝉小程序制作平台
  • 网站建设金手指排名专业昆明微商城开发
  • 微网站建设比较全面的是淘客怎么做自己的网站
  • 在线网站分析工具收录优美图片崩了
  • 设计素材网站哪几个好用哈尔滨网站制作哪里专业
  • 网站优化排名工具用wordpress做官网
  • 淄博网站seo公司建站流程
  • 郑州+高端网站建设开发公司把已经出售的房子一房二卖卖给股东个人