后续:https://blog.csdn.net/qq_36301061/article/details/122461379
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
Logo

开源、云原生的融合云平台

更多推荐