Kubernetes(K8S)一

2023-05-16

K8S
之前写了docker发现 docker只能在单机部署 docker部署分布式系统还是很麻烦 所以就有了K8S K8S全称Kubernetes(读音 库波奈第丝)可以把K8S理解为一个在docker基础上进一步封装 让docker可以支持部署分布式系统 当然docker也有自己实现的用来部署分布式系统的工具 docker-swarm只不过docker-swarm被k8s打败了 k8s是一个管理docker的工具实现了自动化运维管理多个跨机器 Docker 程序的集群

K8S核心特性

服务发现与负载均衡:无需修改你的应用程序即可使用陌生的服务发现机制。
存储编排:自动挂载所选存储系统,包括本地存储。
Secret和配置管理:部署更新Secrets和应用程序的配置时不必重新构建容器镜像,且不必将软件堆栈配置中的秘密信息暴露出来。
批量执行:除了服务之外,Kubernetes还可以管理你的批处理和CI工作负载,在期望时替换掉失效的容器。
水平扩缩:使用一个简单的命令、一个UI或基于CPU使用情况自动对应用程序进行扩缩。
自动化上线和回滚:Kubernetes会分步骤地将针对应用或其配置的更改上线,同时监视应用程序运行状况以确保你不会同时终止所有实例。
自动装箱:根据资源需求和其他约束自动放置容器,同时避免影响可用性。
自我修复:重新启动失败的容器,在节点死亡时替换并重新调度容器,杀死不响应用户定义的健康检查的容器。

K8S集群安装
搭建K8S集群,准备三台2核4G的虚拟机(内存至少2G以上),操作系统选择用centos 7以上版本,先在三台机器上装好docker(安装参考之前写的docker的文章,docker与k8s的版本自行百度,防止与K8S的兼容性问题):
在三台机器上都执行如下命令操作:
1、关闭防火墙

systemctl stop firewalld
systemctl disable firewalld

2、关闭 selinux

sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久关闭
setenforce 0 # 临时关闭

3、关闭 swap

swapoff -a # 临时关闭
vim /etc/fstab # 永久关闭
#注释掉swap这行
# /dev/mapper/centos-swap swap                    swap    defaults        0 0

systemctl reboot #重启生效

free -m  #查看下swap交换区是否都为0,如果都为0则swap关闭成功

4、给三台机器分别设置主机名

hostnamectl set-hostname <hostname>
第一台:k8s-master
第二台:k8s-node1
第三台:k8s-node2

5、在 k8s-master机器添加hosts,执行如下命令,ip需要修改成你自己机器的ip

cat >> /etc/hosts << EOF
192.168.65.160 k8s-master
192.168.65.203 k8s-node1
192.168.65.210 k8s-node2
EOF

6、将桥接的IPv4流量传递到iptables

cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

sysctl --system # 生效

7、设置时间同步

yum install ntpdate -y
ntpdate time.windows.com

8、添加k8s yum源

cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

9、如果之前安装过k8s,先卸载旧版本

yum remove -y kubelet kubeadm kubectl

10、查看可以安装的版本

yum list kubelet --showduplicates | sort -r

11、安装kubelet、kubeadm、kubectl 指定版本,我们使用kubeadm方式安装k8s集群

yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0

12、开机启动kubelet

systemctl enable kubelet
systemctl start kubelet

在k8s-master机器上执行初始化操作(里面的第一个ip地址就是k8s-master机器的ip,改成你自己机器的,后面两个ip网段不用动)

kubeadm init --apiserver-advertise-address=192.168.65.160 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.18.0 --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16

!!!! 
	--service-cid是设置k8s的service的虚拟ip网段
	--pod-network-cidr是设置k8s的pod网段   这些ip网段是k8s集群内部通信用的

在这里插入图片描述

在k8s-master机器上执行如下命令:

#配置使用 kubectl 命令工具(类似docker这个命令),执行上图第二个红框里的命令
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

#查看kubectl是否能正常使用
kubectl get nodes

#安装 Pod 网络插件
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
# 如果上面这个calico网络插件安装不成功可以试下下面这个
# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kubeflannel.yml

在所有k8s node机器执行上图第三个红框里的命令

# 将node节点加入进master节点的集群里,复制上图第三个红框里的命令执行
kubeadm join 192.168.65.160:6443 --token hbovty.6x82bkdlsk6dfy32 \
    --discovery-token-ca-cert-hash sha256:659511b431f276b2a5f47397677b1dff74838ae5eb18e24135e6dae1b8c45840

在k8s-master机器执行查看节点命令

kubectl get nodes

安装成功展示下图
在这里插入图片描述

补充:如果node节点添加进集群失败,可以删除节点重新添加
要删除 k8s-node1 这个节点,首先在 master 节点上依次执行以下两个命令

kubectl drain k8s-node1 --delete-local-data --force --ignore-daemonsets
kubectl delete node k8s-node1

执行后通过 kubectl get node 命令可以看到 k8s-node1 已被成功删除
接着在 k8s-node1 这个 Node 节点上执行如下命令,这样该节点即完全从 k8s 集群中脱离开来,之后就可以重新执行命令添加到集群

kubeadm reset

用K8S部署Nginx
在k8s-master机器上执行

# 创建一次deployment部署
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort  # --port是service的虚拟ip对应的端口
# 查看Nginx的pod和service信息
kubectl get pod,svc -o wide

–port=80这个80端口是映射k8s给我们启动的Nginx的端口这是k8s集群内部使用的它的ip就是在安装k8s的时候设置的哪个网段 k8s会根据哪个网段随机生成一个ip地址
–type=NodePort这个表示对外开放的端口也就是我们可以通过比如k8s在虚拟机里运行的 而我们宿主机用浏览器访问虚拟机用的地址的端口就是这里设置的它的ip就是虚拟机的ip这个NodePort表示随机一个端口可以自己指定
在这里插入图片描述

虚拟机的ip:30433访问Nginx 这里是什么意思后面会写

k8s架构图

在这里插入图片描述
kube-apiserver可以看做成k8s的网关 我们执行的k8s命令首先会经过kube-apiserver它然后它在转发给kube-controller-manager 这个kube-controller-manager使用来解析命令的 它解析完就会指定我们要让k8s做个什么事 然后kube-controller-manager在把解析好的数据发给kube-apiserver然后kube-apiserver把这个数据存储到etcd中 这个etcd是k8s的数据库 这个是执行一个命令的过程 然后kube-scheduler是用来做负载均衡的比如上面运行了一个Nginx这个运行时在k8s的主节点运行的 运行Nginx与如果没有Nginx的镜像的下载都是在从节点运行的上面的安装步骤安装的是一个主节点两个从节点 然后运行的时候kube-scheduler会做负载均衡告诉k8s要把Nginx放到哪一个从节点的机器上 负载均衡会通过kubelet发送的数据进行计算 这个kubelet有一个定时器每一段时间就会向kube-apiserver发送当前机器的状态比如cpu的使用率 kube-apiserver收到这些数据之后kube-apiserver会发送给kube-scheduler 让kube-scheduler进行计算看看那台机器状态好 然后kube-scheduler计算好之后会把结果发送给kube-apiserver然后kube-apiserver把结果放到etcd中进行存储 当执行运行的命令时会去etcd中查找这个结果 拿到到这个结果中状态最好的机器并把运行的指令发给它 让它去运行程序比如Nginx 这个结果每个kubelet都会获取它们获取到会判断是不是要我做如果不是那么它就不管 然后kube-proxy是从节点之间用来通信的 也就是说 Nginx部署在机器1上 你在外网使用机器2的ip+对外暴露的端口进行访问 也可以访问到Nginx中 也就是只要在k8s集群中 随便使用某个机器的ip都可以访问k8s集群中运行的程序 以上就是对k8s架构图的流程的概括

创建一个Tomcat应用程序
使用 kubectl create deployment 命令可以创建一个应用部署deployment与Pod

#my-tomcat表示pod的名称 --image表示镜像的地址 
kubectl create deployment my-tomcat --image=tomcat:7.0.75-alpine

查看一下deployment的信息

kubectl get deployment

在这里插入图片描述
获取pod的信息,-o wide 表示更详细的显示信息

kubectl get pod -o wide

在这里插入图片描述

查看Pod打印的日志

kubectl logs my-tomcat-685b8fd9c9-rw42d(pod名称)

使用 exec 可以在Pod的容器中执行命令,这里使用 env 命令查看环境变量

kubectl exec my-tomcat-685b8fd9c9-rw42d -- env
kubectl exec my-tomcat-685b8fd9c9-rw42d -- ls /   # 查看容器的根目录下面内容

进入Pod容器内部并执行bash命令,如果想退出容器可以使用exit命令

kubectl exec -it my-tomcat-685b8fd9c9-rw42d -- sh

访问一下这个tomcat pod
集群内访问(在集群里任一worker节点都可以访问)

curl 10.244.36.69:8080

10.244.36.69是k8s给我生成的一个虚拟ip可以通过kubectl get all命令查看或者使用 kubectl get pod -o wide进行查看 通过curl 10.244.36.69:8080在虚拟机内是可以访问的这也验证了之前在安装k8s时说的哪两个网段它这个8080默认跟Tomcat端口一样它这里的8080是k8s中docker的端口 k8s的程序运行的最小单位是pod这里的8080是docker的Tomcat的端口是开放在pod上的pod在docker虚拟机上运行所以说k8s在docker的基础上又封装的一层 这个10.244.36.69:8080只能内网访问外网无法访问需要通过下面的这个命令创建一个service对外暴露一个映射端口

创建一个service

kubectl expose deployment my-tomcat --name=tomcat --port=8080 --type=NodePort

这个 --port=8080 是10.244.36.69:8080这里的8080
这个–type=NodePort是对外网暴露的端口NodePort表示随机 通过下面的指令查看端口号
#查看service信息,port信息里冒号后面的端口号就是对集群外暴露的访问接口

kubectl get svc -o wide

在这里插入图片描述
这个32224就是对外暴露的端口这时我们就可以通过虚拟机的ip加32224访问Tomcat了

#查看pod信息,-w意思是一直等待观察pod信息的变动

kubectl get pod -w

开另外一个linux终端命令窗口执行如下命令,同时观察之前linux的命令窗口的变化情况

kubectl delete pod my-tomcat-685b8fd9c9-rw42d

在这里插入图片描述
发现k8s的自我修复功能

对my-tomcat这个deployment进行扩缩容

# 扩容到5个pod
kubectl scale --replicas=5 deployment my-tomcat

查看pod信息,发现已经有5个tomcat的pod

kubectl get pod

缩容

# 扩容到3个pod
kubectl scale --replicas=3 deployment my-tomcat

滚动升级与回滚
对my-tomcat这个deployment进行滚动升级和回滚,将tomcat版本由tomcat:7.0.75-alpine升级到tomcat:8.0.41-jre8-alpine,再回滚到tomcat:7.0.75-alpine
滚动升级:

kubectl set image deployment my-tomcat tomcat=tomcat:8.0.41-jre8-alpine

可以执行 kubectl get pod -w 观察pod的变动情况,可以看到有的pod在销毁,有的pod在创建

查看pod信息

kubectl get pod

查看某个pod的详细信息,发现pod里的镜像版本已经升级了

kubectl describe pod my-tomcat-547db86547-4btmd

访问下tomcat,看到版本也已经升级

版本回滚:
查看历史版本

kubectl rollout history deploy my-tomcat

回滚到上一个版本

kubectl rollout undo deployment my-tomcat     #--to-revision 参数可以指定回退的版本

再次访问tomcat,发现版本已经回退

6、标签的使用
通过给资源添加Label,可以方便地管理资源(如Deployment、Pod、Service等)。
查看Deployment中所包含的Label

kubectl describe deployment my-tomcat

通过Label查询Pod

kubectl get pods -l app=my-tomcat

通过Label查询Service

kubectl get services -l app=my-tomcat

给Pod添加Label

kubectl label pod my-tomcat-685b8fd9c9-lrwst version=v1

查看Pod的详细信息,可以查看Label信息:

kubectl describe pods my-tomcat-685b8fd9c9-lrwst

通过Label查询Pod

kubectl get pods -l version=v1

通过Label删除服务

kubectl delete service -l app=test-service
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Kubernetes(K8S)一 的相关文章

随机推荐

  • 画格子

    题目描述 画一些小格子 xff0c 如下所示 xff1a MAKEAMERICA AKEAMERICAG KEAMERICAGR EAMERICAGRE AMERICAGREA MERICAGREAT ERICAGREATA RICAGRE
  • golang -----------字符串(rune,string,type)

    一 内存布局 字符串在Go语言内存模型中用一个2字长的数据结构表示 它包含一个指向字符串存储数据的指针和一个长度数据 因为string类型是不可变的 xff0c 对于多字符串共享同一个存储数据是安全的 切分操作str i j 会得到一个新的
  • HTTP中GET,POST和PUT的区别

    一 HTTP中定义了以下几种请求方法 1 GET xff1b 2 POST xff1b 3 PUT xff1b 4 DELETE 5 HEAD xff1b 6 TRACE xff1b 7 OPTIONS xff1b 二 各个方法介绍 xff
  • B树,B+树,红黑树应用场景笔记

    一 B树的应用 1 B树大量应用在数据库和文件系统当中 它的设计思想是 xff0c 将相关数据尽量集中在一起 xff0c 以便一次读取多个数据 xff0c 减少硬盘操作次数 B树算法减少定位记录时所经历的中间过程 xff0c 从而加快存取速
  • 使用 Gitee 进行代码管理

    为什么使用 Gitee 这里推荐使用 Gitee 进行代码管理 Gitee 和 Github 最大的区别在我看来就是私有库的免费 xff0c 在 Github 上建立私有库是需要收费的 xff0c 而在 Gitee 上建立私有库是不需要收费
  • kubernetes的Kube-proxy的iptables转发规则

    概念 kube proxy 实际上并不起一个 proxy 的作用 xff0c 而是 watch 变更并更新 iptables xff0c 也就是说 xff0c client 的请求直接通过 iptables 路由 如果kube proxy通
  • kube-proxy ipvs模式详解

    一 kube proxy 开启 ipvs 1 环境准备 xff1a 测试环境为kubernetes集群 xff0c 一台master节点 xff0c 一台node节点 集群网络使用flanneld搭建 注意 xff1a master节点上也
  • k8s部署Traefik

    Ingress ingress是从kubernetes集群外访问集群的入口 xff0c 将用户的URL请求转发到不同的service上 Ingress相当于nginx apache等负载均衡方向代理服务器 xff0c 其中还包括规则定义 x
  • (1)webpack介绍

    一 webpack简介 webpack 61 Web Package xff0c webpack是一个现代JS应用程序的静态模块打包器 xff08 module bundler xff09 模块 xff08 模块化开发 xff0c 可以提高
  • MAML: meta learning 论文分析

    https zhuanlan zhihu com p 57864886 一 Meta Learning 简述 Meta Learning xff08 即元学习 xff09 是最近比较火的研究方向 xff0c 其思想是learning to
  • Oracle数据库权限

    Oracle数据库权限基本认识 一 oracle权限 ORACLE系统提供三种权限 xff1a Object 对象级 System 系统级 Role 角色级 权限分类 1 系统权限 xff1a 系统规定用户使用数据库的权限 xff08 系统
  • 解决:rospack depends 报错: could not find python module 'rosdep2.rospack'. is rosdep up-to-date

    这个问题全部如下 xff1a Traceback most recent call last File 34 home suli local lib python2 7 site packages rosdep2 init py 34 li
  • Ubuntu系统日常崩溃之-terminal打不开

    我也不记得干了什么 xff0c 莫名其妙的terminal就打不开了 xff0c 不只是通过快捷键打不开 xff0c 反正各种都打不开 xff0c 每次点击terminal xff0c 它会出现在任务栏上面 xff0c 之后鼠标就变成圆圈转
  • ARM交叉编译工具链

    为什么要用交叉编译器 xff1f 交叉编译通俗地讲就是在一种平台上编译出能运行在体系结构不同的另一种平台上的程序 xff0c 比如在PC平台 xff08 X86 CPU xff09 上编译出能运行在以ARM为内核的CPU平台上的程序 xff
  • 最近发现有很多人一直在问苹果ID双重认证怎么关闭。

    最近发现有很多人一直在问苹果ID双重认证怎么关闭 xff1f 其实我想说大家都粗心了 xff0c 双重认证是和ios版本没有关系的 xff0c 无论什么IOS版本开通的双重认证都是可以关闭的 https support apple com
  • QT - QT中配置MSVC编译环境 以及 VS中配置QT开发环境

    本文主要记录一下如何在 QT5 14 2 中配置 MSVC2017 构建套件 xff0c 以及在VS2017中配置QT的开发环境 开发环境为 Win10 43 QT5 14 2 43 Visual Studio 2017 1 VS2017安
  • Mysql启用only_full_group_by模式

    Expression 3 of SELECT list is not in GROUP BY clause and contains nonaggregated column userinfo t long user name which
  • 配置opencv3.1+caffe

    为了配置caffe做reid这是官方的入口 caffe reid https github com zlmzju caffe tree reid caffe install http caffe berkeleyvision org ins
  • reEFInd(refind)引导Windows+deepin双系统

    本文已迁移至 xff1a https www aflyingfish top articles 7fdc1ca8cf58
  • Kubernetes(K8S)一

    K8S 之前写了docker发现 docker只能在单机部署 docker部署分布式系统还是很麻烦 所以就有了K8S K8S全称Kubernetes xff08 读音 库波奈第丝 xff09 可以把K8S理解为一个在docker基础上进一步