电视台网站建设方案.doc,wordpress 热门排行,免费找客源软件,php网站建设考试二 Kubernetes介绍
1.1 应用部署方式演变
在部署应用程序的方式上#xff0c;主要经历了三个时代#xff1a; 传统部署#xff1a;互联网早期#xff0c;会直接将应用程序部署在物理机上 优点#xff1a;简单#xff0c;不需要其它技术的参与 缺点#xff1a;不能为应…二 Kubernetes介绍
1.1 应用部署方式演变
在部署应用程序的方式上主要经历了三个时代 传统部署互联网早期会直接将应用程序部署在物理机上 优点简单不需要其它技术的参与 缺点不能为应用程序定义资源使用边界很难合理地分配计算资源而且程序之间容易产生影响 虚拟化部署可以在一台物理机上运行多个虚拟机每个虚拟机都是独立的一个环境 优点程序环境不会相互产生影响提供了一定程度的安全性 缺点增加了操作系统浪费了部分资源 容器化部署与虚拟化类似但是共享了操作系统 优点 可以保证每个容器拥有自己的文件系统、CPU、内存、进程空间等 运行应用程序所需要的资源都被容器包装并和底层基础架构解耦 容器化的应用程序可以跨云服务商、跨Linux操作系统发行版进行部署 容器化部署方式给带来很多的便利但是也会出现一些问题比如说
一个容器故障停机了怎么样让另外一个容器立刻启动去替补停机的容器当并发访问量变大的时候怎么样做到横向扩展容器数量
这些容器管理的问题统称为容器编排问题为了解决这些容器编排问题就产生了一些容器编排的软件
SwarmDocker自己的容器编排工具MesosApache的一个资源统一管控的工具需要和Marathon结合使用KubernetesGoogle开源的的容器编排工具 1.2 kubernetes简介 kubernetes是一个全新的基于容器技术的分布式架构领先方案是谷歌严格保密十几年的秘密武器----Borg系统的一个开源版本于2014年9月发布第一个版本2015年7月发布第一个正式版本。
kubernetes官网
kubernetes的本质是一组服务器集群它可以在集群的每个节点上运行特定的程序来对节点中的容器进行管理。目的是实现资源管理的自动化主要提供了如下的主要功能
自我修复一旦某一个容器崩溃能够在1秒中左右迅速启动新的容器弹性伸缩可以根据需要自动对集群中正在运行的容器数量进行调整服务发现服务可以通过自动发现的形式找到它所依赖的服务负载均衡如果一个服务起动了多个容器能够自动实现请求的负载均衡版本回退如果发现新发布的程序版本有问题可以立即回退到原来的版本存储编排可以根据容器自身的需求自动创建存储卷 1.3 kubernetes组件
一个kubernetes集群主要是由控制节点(master做管理)、工作节点(node) 构成每个节点上都会安装不同的组件。
master集群的控制平面负责集群的决策 ( 集群管理者 ) ApiServer : 资源操作的唯一入口接收用户输入的命令提供认证、授权、API注册和发现等机制 Scheduler : 负责集群资源调度计算按照预定的调度策略将Pod调度到相应的node节点上 ControllerManager : 负责维护集群的状态比如程序部署安排、故障检测、自动扩展、滚动更新等 Etcd 负责存储集群中各种资源对象的信息默认使用etcd也可以手动改为mysql等 node集群的数据平面负责为容器提供运行环境 (真正干活 ) Kubelet : 负责维护容器的生命周期即通过控制docker来创建、更新、销毁容器 KubeProxy : 负责提供集群内部的服务发现和负载均衡访问k8s里程序的入口例如他可以提供访问linux的入口 Docker : 负责节点上容器的各种操作 下面以部署一个nginx服务来说明kubernetes系统各个组件调用关系 首先要明确一旦kubernetes环境启动之后master和node都会将自身的信息存储到etcd数据库中 一个nginx服务的安装请求会首先被发送到master节点的apiServer组件 apiServer组件会调用scheduler组件来决定到底应该把这个服务安装到哪个node节点上 在此时它会从etcd中读取各个node节点的信息然后按照一定的算法进行选择并将结果告知apiServer apiServer调用controller-manager去调度Node节点安装nginx服务 kubelet接收到指令后会通知docker然后由docker来启动一个nginx的pod pod是kubernetes的最小操作单元容器必须跑在pod中 至此一个nginx服务就运行了如果需要访问nginx就需要通过kube-proxy来对pod产生访问的代理
这样外界用户就可以访问集群中的nginx服务了
1.4 kubernetes概念
Master集群控制节点每个集群需要至少一个master节点负责集群的管控
Node工作负载节点由master分配容器到这些node工作节点上然后node节点上的docker负责容器的运行
Podkubernetes的最小控制单元容器都是运行在pod中的一个pod中可以有1个或者多个容器
Controller控制器通过它来实现对pod的管理比如启动pod、停止pod、伸缩pod的数量等等
Servicepod对外服务的统一入口下面可以维护者同一类的多个pod
Label标签用于对pod进行分类同一类pod会拥有相同的标签
NameSpace命名空间用来隔离pod的运行环境默认pod之间是可以相互访问的有了Namspace后可以控制pod之间是否能访问 二 kubernetes集群环境搭建
2.1 集群类型
Kubernetes集群大致分为两类一主多从和多主多从。 ● 一主多从一个Master节点和多台Node节点搭建简单但是有单机故障风险适合用于测试环境。 ● 多主多从多台Master和多台Node节点搭建麻烦安全性高适合用于生产环境。 为了测试方便本次搭建的是一主多从类型的集群。 2.1.1 安装方式
kubernetes有多种部署方式目前主流的方式有kubeadm、minikube、二进制包。
● minikube一个用于快速搭建单节点的kubernetes工具。 ● kubeadm一个用于快速搭建kubernetes集群的工具。 ● 二进制包从官网上下载每个组件的二进制包依次去安装此方式对于理解kubernetes组件更加有效。
我们需要安装kubernetes的集群环境但是又不想过于麻烦所以选择kubeadm方式
2.1.2 主机规划
角色IP地址操作系统配置Master192.168.18.100CentOS7.5基础设施服务器2核CPU2G内存50G硬盘Node1192.168.18.101CentOS7.5基础设施服务器2核CPU2G内存50G硬盘Node2192.168.18.102CentOS7.5基础设施服务器2核CPU2G内存50G硬盘
2.2 环境搭建
2.2.1 前言 本次环境搭建需要三台CentOS服务器一主二从然后在每台服务器中分别安装Docker18.06.3、kubeadm1.18.0、kubectl1.18.0和kubelet1.18.0。 没有特殊说明就是三台机器都需要执行。
配置虚拟机IP与主机名 配置ip 这里改为手动设置ip 具体的ip网断是多少?需要查一下这里 选择net模式左下角就是你自己虚拟机的网断注意vmware默认.2是网关所以ip不可以配成192.1681.109.2 所以回到ip配置这里继续
DNS地址使用阿里的地址即可
2.2.2 环境初始化
2.2.2.1 检查操作系统的版本
检查操作系统的版本要求操作系统的版本至少在7.5以上
cat /etc/redhat-release2.2.2.2 关闭防火墙和禁止防火墙开机启动
生产环境不能这么干只打开使用的端口即可
关闭防火墙
systemctl stop firewalld禁止防火墙开机启动
systemctl disable firewalld2.2.2.3 设置主机名
设置主机名语法
hostnamectl set-hostname hostname设置192.168.18.100的主机名
hostnamectl set-hostname master设置192.168.18.101的主机名
hostnamectl set-hostname node1设置192.168.18.102的主机名
hostnamectl set-hostname node22.2.2.4 主机名解析
为了方便后面集群节点间的直接调用需要配置一下主机名解析企业中推荐使用内部的DNS服务器里配置。
#vim /etc/hosts
192.168.18.100 master
192.168.18.101 node1
192.168.18.102 node2检测配置是否成功机器间直接ping主机名
2.2.2.5 时间同步
kubernetes要求集群中的节点时间必须精确一致所以在每个节点上添加时间同步企业里建议配置自己的时间同步服务器
直接执行这俩命令
systemctl start chronyd
systemctl enable chronyd或者执行下边这俩命令也行
yum install ntpdate -yntpdate time.windows.com2.2.2.6 关闭selinux
selinux是linux下的安全服务如果不关闭在安装集群中会产生各种问题
查看selinux是否开启
getenforce永久关闭selinux需要重启
#方式一
sed -i s/enforcing/disabled/ /etc/selinux/config
#方式二编辑/etc/selinux/config文件修改SELINUX的值为disable
SELINUXdisable临时关闭selinux重启之后无效
# 临时关闭
setenforce 02.2.2.7 关闭swap分区 永久关闭swap分区需要重启
sed -ri s/.*swap.*/#/ /etc/fstab临时关闭swap分区重启之后无效
swapoff -a修改linux内核参数
2.2.2.8 将桥接的IPv4流量传递到iptables的链
在每个节点上将桥接的IPv4流量传递到iptables的链
cat /etc/sysctl.d/k8s.conf EOF
net.bridge.bridge-nf-call-ip6tables 1
net.bridge.bridge-nf-call-iptables 1
net.ipv4.ip_forward 1
vm.swappiness 0
EOF# 加载br_netfilter模块
modprobe br_netfilter# 查看是否加载
lsmod | grep br_netfilter# 生效
sysctl --system2.2.2.9 开启ipvs
● 在kubernetes中service有两种代理模型一种是基于iptables另一种是基于ipvs的。ipvs的性能要高于iptables的但是如果要使用它需要手动载入ipvs模块。 ● 在每个节点安装ipset和ipvsadm
yum -y install ipset ipvsadm
# 或者
yum install ipset ipvsadmin -y 在所有节点执行如下脚本:添加需要的模块写入脚本文件直接复制下边的命令回车即刻
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授权、运行、检查是否加载
chmod 755 /etc/sysconfig/modules/ipvs.modules 执行脚本
/bin/bash /etc/sysconfig/modules/ipvs.modules 检查是否加载
lsmod | grep -e ipvs -e nf_conntrack_ipv42.2.2.10 重启三台机器
重启三台Linux机器
reboot2.2.3 每个节点安装Docker、kubeadm、kubelet和kubectl
2.2.3.1 安装Docker
安装docker
# 切换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
# --setoptobsoletes0:不写这个参数会自动安装更高版本
yum install --setoptobsoletes0 docker-ce-18.06.3.ce-3.el7 -y
# yum -y install docker-ce-18.06.3.ce-3.el7启动docker
systemctl start docker
# 设置开机启动docker
systemctl enable docker 查看docker版本
docker version设置Docker镜像加速器上边已经设置过了这里不做也行
sudo mkdir -p /etc/dockersudo tee /etc/docker/daemon.json -EOF
{exec-opts: [native.cgroupdriversystemd], registry-mirrors: [https://du3ia00u.mirror.aliyuncs.com], live-restore: true,log-driver:json-file,log-opts: {max-size:500m, max-file:3},storage-driver: overlay2
}
EOFsudo systemctl daemon-reloadsudo systemctl restart docker2.2.3.2 添加阿里云的YUM软件源
由于kubernetes的镜像源在国外非常慢这里切换成国内的阿里云镜像源
cat /etc/yum.repos.d/kubernetes.repo EOF
[kubernetes]
nameKubernetes
baseurlhttps://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled1
gpgcheck0
repo_gpgcheck0
gpgkeyhttps://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF或者vim /etc/yum.repos.d/kubernetes.repo然后输入如下内容
[kubernetes]
nameKubernetes
baseurlhttps://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled1
gpgcheck0
repo_gpgcheck0
gpgkeyhttps://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg2.2.3.3 安装kubeadm、kubelet和kubectl
由于版本更新频繁这里指定版本号部署
yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0为了实现Docker使用的cgroup drvier和kubelet使用的cgroup drver一致建议修改/etc/sysconfig/kubelet文件的内容
vim /etc/sysconfig/kubelet# 修改
KUBELET_EXTRA_ARGS--cgroup-driversystemd
KUBE_PROXY_MODEipvs设置kubelet为开机自启动即可由于没有生成配置文件集群初始化后自动启动
systemctl enable kubelet8完
2.2.4 查看k8s所需镜像
查看k8s所需镜像
kubeadm config images list下载镜像这里下载1.17.4 复制完上边的命令后直接回车 使用for循环下载上边的镜像复制完直接回车 查看下载下来的镜像
2.2.5 部署k8s的Master节点
部署k8s的Master节点192.168.18.100
情况一 上边已经下载好了镜像可以直接使用下边的命令初始化master即可
情况二 如果之前没有下载好镜像可以使用下边命令在线下载安装master
# 由于默认拉取镜像地址k8s.gcr.io国内无法访问这里需要指定阿里云镜像仓库地址
kubeadm init \--apiserver-advertise-address192.168.18.100 \--image-repository registry.aliyuncs.com/google_containers \--kubernetes-version v1.18.0 \--service-cidr10.96.0.0/12 \--pod-network-cidr10.244.0.0/16根据提示消息在Master节点上使用kubectl工具
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config2.2.6 部署k8s的Node节点
master安装后控制台有如下命令复制该命令到各个node节点去执行把node节点加入到master集群里
根据提示在192.168.18.101和192.168.18.102上添加如下的命令
# 把当前node节点加入到集群里注意下边的命令粘贴的是上边master安装后控制台打印出来的命令
kubeadm join 192.168.18.100:6443 --token jv039y.bh8yetcpo6zeqfyj \--discovery-token-ca-cert-hash sha256:3c81e535fd4f8ff1752617d7a2d56c3b23779cf9545e530828c0ff6b507e0e26查看集群里的节点信息 可以看到状态是NotReady即网络还没通节点之间不能通信
默认的token有效期为24小时当过期之后该token就不能用了这时可以使用如下的命令创建token
kubeadm token create --print-join-command# 生成一个永不过期的token
kubeadm token create --ttl 0 --print-join-command2.2.7 部署CNI网络插件
根据提示在Master节点上使用kubectl工具查看节点状态
kubectl get nodes● kubernetes支持多种网络插件比如flannel、calico、canal等任选一种即可本次选择flannel如果网络不行可以使用本人提供的当然你也可以安装calico ● 在Master节点上获取flannel配置文件(可能会失败如果失败请下载到本地然后安装) wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml下载下来后修改文件里的仓库为国内的仓库地址
使用配置文件启动flannel
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml查看部署CNI网络插件进度
kubectl get pods -n kube-system再次在Master节点使用kubectl工具查看节点状态
kubectl get nodes查看集群健康状况
kubectl get cskubectl cluster-info2.3 服务部署
2.3.1 前言
在Kubernetes集群中部署一个Nginx程序测试下集群是否正常工作。
2.3.2 步骤
部署Nginx在master操作即可
kubectl create deployment nginx --imagenginx:1.14-alpine暴露端口
# NodePort集群外的浏览器可以访问
kubectl expose deployment nginx --port80 --typeNodePort查看服务状态
# svcservice
kubectl get pods,svc2.4 kubernetes中kubectl命令自动补全
yum install -y bash-completionsource /usr/share/bash-completion/bash_completionsource (kubectl completion bash)echo “source (kubectl completion bash)” ~/.bashrcvim /root/.bashrc source /usr/share/bash-completion/bash_completionsource (kubectl completion bash)二 kubernetes集群环境搭建
2.1 前置知识点
目前生产部署Kubernetes 集群主要有两种方式
kubeadm
Kubeadm 是一个K8s 部署工具提供kubeadm init 和kubeadm join用于快速部署Kubernetes 集群。
官方地址https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/
二进制包
从github 下载发行版的二进制包手动部署每个组件组成Kubernetes 集群。
Kubeadm 降低部署门槛但屏蔽了很多细节遇到问题很难排查。如果想更容易可控推荐使用二进制包部署Kubernetes 集群虽然手动部署麻烦点期间可以学习很多工作原理也利于后期维护。 2.2 kubeadm 部署方式介绍
kubeadm 是官方社区推出的一个用于快速部署kubernetes 集群的工具这个工具能通过两条指令完成一个kubernetes 集群的部署
创建一个Master 节点kubeadm init将Node 节点加入到当前集群中$ kubeadm join Master 节点的IP 和端口
2.3 安装要求
在开始之前部署Kubernetes 集群机器需要满足以下几个条件
一台或多台机器操作系统CentOS7.x-86_x64硬件配置2GB 或更多RAM2 个CPU 或更多CPU硬盘30GB 或更多集群中所有机器之间网络互通可以访问外网需要拉取镜像禁止swap 分区
2.4 最终目标
在所有节点上安装Docker 和kubeadm部署Kubernetes Master部署容器网络插件部署Kubernetes Node将节点加入Kubernetes 集群中部署Dashboard Web 页面可视化查看Kubernetes 资源
2.5 准备环境 角色IP地址组件k8s-master01192.168.5.3dockerkubectlkubeadmkubeletk8s-node01192.168.5.4dockerkubectlkubeadmkubeletk8s-node02192.168.5.5dockerkubectlkubeadmkubelet
2.6 系统初始化
2.6.1 设置系统主机名以及 Host 文件的相互解析
hostnamectl set-hostname k8s-master01 bash
hostnamectl set-hostname k8s-node01 bash
hostnamectl set-hostname k8s-node02 bashcat EOF /etc/hosts
192.168.5.3 k8s-master01
192.168.5.4 k8s-node01
192.168.5.5 k8s-node02
EOFscp /etc/hosts root192.168.5.4:/etc/hosts
scp /etc/hosts root192.168.5.5:/etc/hosts 2.6.2 安装依赖文件所有节点都要操作
yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget vim net-tools git2.6.3 设置防火墙为 Iptables 并设置空规则所有节点都要操作
systemctl stop firewalld systemctl disable firewalldyum -y install iptables-services systemctl start iptables systemctl enable iptables iptables -F service iptables save2.6.4 关闭 SELINUX所有节点都要操作
swapoff -a sed -i / swap / s/^\(.*\)$/#\1/g /etc/fstabsetenforce 0 sed -i s/^SELINUX.*/SELINUXdisabled/ /etc/selinux/config2.6.5 调整内核参数对于 K8S所有节点都要操作
modprobe br_netfiltercat EOF kubernetes.conf
net.bridge.bridge-nf-call-iptables1
net.bridge.bridge-nf-call-ip6tables1
net.ipv4.ip_forward1
net.ipv4.tcp_tw_recycle0
vm.swappiness0 # 禁止使用 swap 空间只有当系统 OOM 时才允许使用它
vm.overcommit_memory1 # 不检查物理内存是否够用
vm.panic_on_oom0 # 开启 OOM
fs.inotify.max_user_instances8192
fs.inotify.max_user_watches1048576
fs.file-max52706963
fs.nr_open52706963
net.ipv6.conf.all.disable_ipv61
net.netfilter.nf_conntrack_max2310720
EOFcp kubernetes.conf /etc/sysctl.d/kubernetes.confsysctl -p /etc/sysctl.d/kubernetes.conf2.6.6 调整系统时区所有节点都要操作
# 设置系统时区为 中国/上海
timedatectl set-timezone Asia/Shanghai
# 将当前的 UTC 时间写入硬件时钟
timedatectl set-local-rtc 0
# 重启依赖于系统时间的服务
systemctl restart rsyslog
systemctl restart crond2.6.7 设置 rsyslogd 和 systemd journald所有节点都要操作
# 持久化保存日志的目录
mkdir /var/log/journal
mkdir /etc/systemd/journald.conf.d
cat /etc/systemd/journald.conf.d/99-prophet.conf EOF
[Journal]
# 持久化保存到磁盘
Storagepersistent# 压缩历史日志
CompressyesSyncIntervalSec5m
RateLimitInterval30s
RateLimitBurst1000# 最大占用空间 10G
SystemMaxUse10G# 单日志文件最大 200M
SystemMaxFileSize200M# 日志保存时间 2 周
MaxRetentionSec2week# 不将日志转发到 syslog
ForwardToSyslogno
EOFsystemctl restart systemd-journald2.6.8 kube-proxy开启ipvs的前置条件所有节点都要操作
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
EOFchmod 755 /etc/sysconfig/modules/ipvs.modules bash /etc/sysconfig/modules/ipvs.modules lsmod | grep -e ip_vs -e nf_conntrack_ipv42.6.9 安装 Docker 软件所有节点都要操作
yum install -y yum-utils device-mapper-persistent-data lvm2yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repoyum install -y docker-ce## 创建 /etc/docker 目录
mkdir /etc/dockercat /etc/docker/daemon.json EOF
{
exec-opts: [native.cgroupdriversystemd],
log-driver: json-file,
log-opts: {
max-size: 100m
}
}
EOF
mkdir -p /etc/systemd/system/docker.service.d
# 重启docker服务
systemctl daemon-reload systemctl restart docker systemctl enable docker上传文件到/etc/yum.repos.d/ 目录下也可以 代替 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 命令
docker-ce.repo
[docker-ce-stable]
nameDocker CE Stable - $basearch
baseurlhttps://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/$basearch/stable
enabled1
gpgcheck1
gpgkeyhttps://mirrors.aliyun.com/docker-ce/linux/centos/gpg[docker-ce-stable-debuginfo]
nameDocker CE Stable - Debuginfo $basearch
baseurlhttps://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/debug-$basearch/stable
enabled0
gpgcheck1
gpgkeyhttps://mirrors.aliyun.com/docker-ce/linux/centos/gpg[docker-ce-stable-source]
nameDocker CE Stable - Sources
baseurlhttps://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/source/stable
enabled0
gpgcheck1
gpgkeyhttps://mirrors.aliyun.com/docker-ce/linux/centos/gpg[docker-ce-test]
nameDocker CE Test - $basearch
baseurlhttps://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/$basearch/test
enabled0
gpgcheck1
gpgkeyhttps://mirrors.aliyun.com/docker-ce/linux/centos/gpg[docker-ce-test-debuginfo]
nameDocker CE Test - Debuginfo $basearch
baseurlhttps://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/debug-$basearch/test
enabled0
gpgcheck1
gpgkeyhttps://mirrors.aliyun.com/docker-ce/linux/centos/gpg[docker-ce-test-source]
nameDocker CE Test - Sources
baseurlhttps://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/source/test
enabled0
gpgcheck1
gpgkeyhttps://mirrors.aliyun.com/docker-ce/linux/centos/gpg[docker-ce-nightly]
nameDocker CE Nightly - $basearch
baseurlhttps://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/$basearch/nightly
enabled0
gpgcheck1
gpgkeyhttps://mirrors.aliyun.com/docker-ce/linux/centos/gpg[docker-ce-nightly-debuginfo]
nameDocker CE Nightly - Debuginfo $basearch
baseurlhttps://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/debug-$basearch/nightly
enabled0
gpgcheck1
gpgkeyhttps://mirrors.aliyun.com/docker-ce/linux/centos/gpg[docker-ce-nightly-source]
nameDocker CE Nightly - Sources
baseurlhttps://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/source/nightly
enabled0
gpgcheck1
gpgkeyhttps://mirrors.aliyun.com/docker-ce/linux/centos/gpg2.6.10 安装 Kubeadm 所有节点都要操作
cat EOF /etc/yum.repos.d/kubernetes.repo
[kubernetes]
nameKubernetes
baseurlhttp://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled1
gpgcheck0
repo_gpgcheck0
gpgkeyhttp://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOFyum install -y kubelet kubeadm kubectl systemctl enable kubelet2.7 部署Kubernetes Master
2.7.1 初始化主节点主节点操作
kubeadm init --apiserver-advertise-address192.168.5.3 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.21.1 --service-cidr10.96.0.0/12 --pod-network-cidr10.244.0.0/16mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/config2.7.2 加入主节点以及其余工作节点
kubeadm join 192.168.5.3:6443 --token h0uelc.l46qp29nxscke7f7 \--discovery-token-ca-cert-hash sha256:abc807778e24bff73362ceeb783cc7f6feec96f20b4fd707c3f8e8312294e28f 2.7.3 部署网络
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml下边是文件
---
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:name: psp.flannel.unprivilegedannotations:seccomp.security.alpha.kubernetes.io/allowedProfileNames: docker/defaultseccomp.security.alpha.kubernetes.io/defaultProfileName: docker/defaultapparmor.security.beta.kubernetes.io/allowedProfileNames: runtime/defaultapparmor.security.beta.kubernetes.io/defaultProfileName: runtime/default
spec:privileged: falsevolumes:- configMap- secret- emptyDir- hostPathallowedHostPaths:- pathPrefix: /etc/cni/net.d- pathPrefix: /etc/kube-flannel- pathPrefix: /run/flannelreadOnlyRootFilesystem: false# Users and groupsrunAsUser:rule: RunAsAnysupplementalGroups:rule: RunAsAnyfsGroup:rule: RunAsAny# Privilege EscalationallowPrivilegeEscalation: falsedefaultAllowPrivilegeEscalation: false# CapabilitiesallowedCapabilities: [NET_ADMIN, NET_RAW]defaultAddCapabilities: []requiredDropCapabilities: []# Host namespaceshostPID: falsehostIPC: falsehostNetwork: truehostPorts:- min: 0max: 65535# SELinuxseLinux:# SELinux is unused in CaaSPrule: RunAsAny
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: flannel
rules:
- apiGroups: [extensions]resources: [podsecuritypolicies]verbs: [use]resourceNames: [psp.flannel.unprivileged]
- apiGroups:- resources:- podsverbs:- get
- apiGroups:- resources:- nodesverbs:- list- watch
- apiGroups:- resources:- nodes/statusverbs:- patch
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: flannel
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: flannel
subjects:
- kind: ServiceAccountname: flannelnamespace: kube-system
---
apiVersion: v1
kind: ServiceAccount
metadata:name: flannelnamespace: kube-system
---
kind: ConfigMap
apiVersion: v1
metadata:name: kube-flannel-cfgnamespace: kube-systemlabels:tier: nodeapp: flannel
data:cni-conf.json: |{name: cbr0,cniVersion: 0.3.1,plugins: [{type: flannel,delegate: {hairpinMode: true,isDefaultGateway: true}},{type: portmap,capabilities: {portMappings: true}}]}net-conf.json: |{Network: 10.244.0.0/16,Backend: {Type: vxlan}}
---
apiVersion: apps/v1
kind: DaemonSet
metadata:name: kube-flannel-dsnamespace: kube-systemlabels:tier: nodeapp: flannel
spec:selector:matchLabels:app: flanneltemplate:metadata:labels:tier: nodeapp: flannelspec:affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/osoperator: Invalues:- linuxhostNetwork: truepriorityClassName: system-node-criticaltolerations:- operator: Existseffect: NoScheduleserviceAccountName: flannelinitContainers:- name: install-cniimage: quay.io/coreos/flannel:v0.14.0command:- cpargs:- -f- /etc/kube-flannel/cni-conf.json- /etc/cni/net.d/10-flannel.conflistvolumeMounts:- name: cnimountPath: /etc/cni/net.d- name: flannel-cfgmountPath: /etc/kube-flannel/containers:- name: kube-flannelimage: quay.io/coreos/flannel:v0.14.0command:- /opt/bin/flanneldargs:- --ip-masq- --kube-subnet-mgrresources:requests:cpu: 100mmemory: 50Milimits:cpu: 100mmemory: 50MisecurityContext:privileged: falsecapabilities:add: [NET_ADMIN, NET_RAW]env:- name: POD_NAMEvalueFrom:fieldRef:fieldPath: metadata.name- name: POD_NAMESPACEvalueFrom:fieldRef:fieldPath: metadata.namespacevolumeMounts:- name: runmountPath: /run/flannel- name: flannel-cfgmountPath: /etc/kube-flannel/volumes:- name: runhostPath:path: /run/flannel- name: cnihostPath:path: /etc/cni/net.d- name: flannel-cfgconfigMap:name: kube-flannel-cfg2.8 测试kubernetes 集群
2.8.1 部署nginx 测试
kubectl create deployment nginx --imagenginxkubectl expose deployment nginx --port80 --typeNodePortkubectl get pod,svc三 资源管理
3.1 资源管理介绍
在kubernetes中所有的内容都抽象为资源用户需要通过操作资源来管理kubernetes。 kubernetes的本质上就是一个集群系统用户可以在集群中部署各种服务所谓的部署服务其实就是在kubernetes集群中运行一个个的容器并将指定的程序跑在容器中。 kubernetes的最小管理单元是pod而不是容器所以只能将容器放在Pod中而kubernetes一般也不会直接管理Pod而是通过Pod控制器来管理Pod的。 Pod可以提供服务之后就要考虑如何访问Pod中服务kubernetes提供了Service资源实现这个功能。 当然如果Pod中程序的数据需要持久化kubernetes还提供了各种存储系统。 学习kubernetes的核心就是学习如何对集群上的Pod、Pod控制器、Service、存储等各种资源进行操作
3.2 YAML语言介绍
YAML是一个类似 XML、JSON 的标记性语言。它强调以数据为中心并不是以标识语言为重点。因而YAML本身的定义比较简单号称一种人性化的数据格式语言。
xml:
heimaage15/ageaddressBeijing/address
/heimayml:
heima: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 3.3 资源管理方式
下边是三种创建pod的方式 命令式对象管理直接使用命令去操作kubernetes资源 kubectl run nginx-pod --imagenginx:1.17.1 --port80 命令式对象配置通过命令配置和配置文件去操作kubernetes资源 kubectl create/patch -f nginx-pod.yaml 声明式对象配置通过apply命令和配置文件去操作kubernetes资源 apply创建和更新资源pod有的话就更新没有就创建 kubectl apply -f nginx-pod.yaml
类型操作对象适用环境优点缺点命令式对象管理对象测试简单只能操作活动对象无法审计、跟踪命令式对象配置文件开发可以审计、跟踪项目大时配置文件多操作麻烦声明式对象配置目录开发支持目录操作意外情况下难以调试
3.3.1 命令式对象管理
kubectl命令
kubectl是kubernetes集群的命令行工具通过它能够对集群本身进行管理并能够在集群上进行容器化应用的安装部署。kubectl命令的语法如下
kubectl [command] [type] [name] [flags]comand指定要对资源执行的操作例如create、get、delete可以通过kubectl --help命令查看所有命令
type指定资源类型比如deployment、pod、service
name指定资源的名称名称大小写敏感
flags指定额外的可选参数
# 查看所有pod
kubectl get pod # 查看某个pod
kubectl get pod pod_name# 查看某个pod,以yaml格式展示结果yaml改为json就是以json格式显示
kubectl get pod pod_name -o yaml操作comand类型
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的版本
资源类型type
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配置
下面以一个namespace / pod的创建和删除简单演示下命令的使用
# 创建一个namespace 名称叫dev namespace可以简写为ns
[rootmaster ~]# kubectl create namespace dev
namespace/dev created# 获取namespace
[rootmaster ~]# kubectl get ns 除了dev其他是k8s集群自带的
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默认查询default的namespace下的pod
[rootmaster ~]# kubectl get pod -n dev
NAME READY STATUS RESTARTS AGE
pod 1/1 Running 0 21s# 删除指定ns下的的指定pod
[rootmaster ~]# kubectl delete pods pod-864f9875b9-pcw7x -n dev
pod pod deleted# 删除指定的namespace
[rootmaster ~]# kubectl delete ns dev
namespace dev deleted3.3.2 命令式对象配置
命令式对象配置就是使用命令配合配置文件一起来操作kubernetes资源。
1 创建一个nginxpod.yaml内容如下
#创建名字是dev的namespace
apiVersion: v1
kind: Namespace
metadata:name: dev#yml文件里要写两个名字一样的配置的话需要使用---做分割
---#在dev下创建一个podpod名字是nginxpod镜像以及镜像版本是nginx:1.17.1
apiVersion: v1
kind: Pod
metadata:name: nginxpodnamespace: dev
spec:containers:- name: nginx-containersimage: nginx:1.17.12执行create命令创建资源
[rootmaster ~]# kubectl create -f nginxpod.yaml
namespace/dev created
pod/nginxpod created此时发现创建了两个资源对象分别是namespace和pod
查看名字是dev的namespace
kubectl get ns dev查看dev下的pod
#pod可以写成pods
kubectl get pod -n dev3执行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配置文件里面是命令需要的各种参数3.3.3 声明式对象配置
声明式对象配置跟命令式对象配置很相似但是它只有一个命令apply。
# 首先执行一次kubectl apply -f yaml文件发现创建了资源此处使用的nginxpod.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的运行是需要进行配置的它的配置文件是在master节点下的$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实战