实践出真知——k8s初步熟悉使用介绍,实践搭建nginx集群
off999 2025-01-03 18:13 18 浏览 0 评论
k8s部署搭建参考我上一篇文章:基于Linux初步搭建k8s集群
一、前言
实践是检验真理的唯一标准,只有从实践中才能快速熟悉理解k8s。
三个基本概念,Pod,Service,Namespace。
Pod:k8s最小单元,pod和容器的区别,容器包含在pod中,一个pod中有一个pause容器和若干个业务容器,而容器就是单独的一个容器,简而言之,pod是一组容器,而容器单指一个容器。
Service:pod每次动态创建后,自动分配的ip会不同,所以引入了service(即服务的注册与发现),通俗的讲,就是管理上网功能的,相关于网络管理员,保证网络正常就行。
namespace:命名空间,主要用于隔离
k8s一切皆容器,所有的服务也好,插件也好,都是运行在docker容器之中。
部署项目,类似docker-compose通过yaml文件拉取生成项目布置,docker-compose只能单机本机上部署,但k8s可以集群部署多台服务器,即node节点。
环境介绍:
k8s-master:Ubuntu–192.168.152.100
k8s-node01:Ubuntu–192.168.152.101
k8s-node02:Ubuntu–192.168.152.102
布置之前,先完善kubectl 命令自动补全,因为默认kubectl按快捷键没有补齐的。
#安装bash-completion(如果已经安装忽略即可):
sudo apt install bash-completion
#测试一下:
source /usr/share/bash-completion/bash_completion
source <(kubectl completion bash)
#测试没问题后,对 /root/.bashrc 加2行代码 ,方便以后每次登录自动生效:
source /usr/share/bash-completion/bash_completion
source <(kubectl completion bash)
二、直接创建pod部署nginx(非必要,测试熟悉用,熟悉k8s者可跳过这步)
在yaml文件中,有个kind参数,用来指定创建资源的角色/类型。
正常创建是创建Deployment和Service两个 yaml文件,及kind分别是deployment,Service来搭建。
这里可以直接创建pod 测试来熟悉k8s相关操作。而且只能单个创建pod,无法达到集群的要求。
一般不直接kind: Pod创建pod,而是通过controller来创建pod。deployment为其中一种controller。这里先演示测试最基本的搭建,所以设置为kind:Pod
#编辑
sudo vim nginx_pod.yaml
内容如下,相关参数说明见本文最后。
apiVersion: v1 #核心,对象pod、service等
kind: Pod
metadata: #资源的元数据/属性
name: nginx
labels:
app: nginx
spec: #设置该资源的内容
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80 #容器端口
hostPort: 8081 #让外部访问端口,官方及其不推荐这种方式,走的防火墙iptables方式,本人测试没成功,仍然无法从外部访问。
yaml创建完成后,使用命令 `kubectl apply`或者`kubectl create `加入k8s并创建 pod
两者命令区别:
kubectl create:是先删除所有现有的东西,重新根据yaml文件生成新的。无法覆盖,报错。
kubectl apply:根据配置文件里面列出来的内容,升级现有的,直接覆盖原来的。(建议使用)
kubectl apply -f nginx_pod.yaml
#或者用以下命令
kubectl create -f nginx_pod.yaml
创建完成后,可查看pod 的状态,执行命令:
kubectl get pods -o wide # 列出所有 pod 并显示详细信息
kubectl get pods nginx -o wide # 列出所有nginx pod 并显示详细信息
显示如下,可以看到 nginx pod 已处于 Running 状态,表示刚创建的 pod 已成功运行起来。
ubuntu@k8s-master:~$ kubectl apply -f nginx_pod.yaml
pod/nginx created
ubuntu@k8s-master:~$ kubectl get pods nginx -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx 1/1 Running 0 35s 172.16.58.193 k8s-node02 <none> <none>
通过查看pods状态,可以得到信息,pods的内部IP为172.16.58.193,master已将nginx自动部署至node02节点(如没有特殊设置,k8s会通过服务器负载均衡自动布置合适的node节点上)。
在node2节点的机器上,查看docker可以看到,docker nginx已经运行。
在master主节点上,同样可用类似docker exec的命令,进入容器查看状态。
#进入容器
kubectl exec -it nginx -- /bin/sh
#进入容器后,执行命令访问nginx。可正常返回nginx页面。
curl localhost
测试完成后,可以用以下命令删除此pod
kubectl delete -f nginx_pod.yaml
通过测试可以看出,使用hostPort的方式,这种很难通过外网访问内部容器。
所以通过其他方式访问,最常用的是NodePort的方式,对比这两种方式:
1、使用hostPort的方式,这种还会占用其他宿主机的端口,同时会引发其他错误,官方也不推荐。
2、使用NodePort的方式,k8s广泛应用的服务暴露方式,普遍运用的方式,这种也是Service默认的网络端口模式。
接下来用Deployment和Service正常创建多个pod。
三、正式部署nginx集群
1、创建 deployment
通过deployment创建Pod,创建deployment yaml文件
sudo vim nginx-dep.yml
内容为
apiVersion: apps/v1 #Deployment用这个
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector: #标签选择器,与metadata中的labels:标签共同作用,目前不需要理解
matchLabels: #选择包含标签app:nginx的资源
app: nginx
replicas: 3 # 镜像副本数量
template: #这是选择或创建的Pod的模板
metadata: #Pod的元数据
labels: #Pod的标签,上面的selector即选择包含标签app:nginx的Pod
app: nginx
spec: #即在pod中部署功能
containers: #以下容器内容
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
完成后,加入k8s创建pod
kubectl apply -f nginx-dep.yaml
查看pod
kubectl get deploy -o wide
可以看到,3个pod创建完成,分别分布在两个node节点机器上。
ubuntu@k8s-master:~$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-deployment-585449566-547fh 1/1 Running 0 78s 172.16.85.193 k8s-node01 <none> <none>
nginx-deployment-585449566-pjs7n 1/1 Running 0 78s 172.16.58.195 k8s-node02 <none> <none>
nginx-deployment-585449566-txzvf 1/1 Running 0 78s 172.16.58.196 k8s-node02 <none> <none>
2、创建 Service
创建Service yaml文件
sudo vim nginx-service.yaml
内容为
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
nodePort: 30080 #端口范围只能是 30000-32767,外部通过此端口访问
type: NodePort #nodePort方式,必须声明这类型
完成后,加入k8s创建
kubectl create -f nginx-service.yaml
此时需要用kubectl get svc查看服务了,而不是查看pod。
kubectl get svc -o wide
查看如下已正常启动
ubuntu@k8s-master:~$ kubectl get svc -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 25h <none>
nginx-service NodePort 10.101.18.212 <none> 80:30080/TCP 106s app=nginx
3、测试访问nginx
在浏览器输入节点IP:30080访问
master主节点IP访问测试:
master节点IP访问测试:
测试完成,这时候正式nginx集群搭建完成。
四、Namespace 命名空间 (扩展)
1、简介
命名空间适用于存在很多跨多个团队或项目的用户的场景。对于只有几到几十个用户的集群,根本不需要创建或考虑命名空间。当需要名称空间提供的功能时,请开始使用它们。
简单理解,不同团队之间的项目,隔离作用,互不干扰。但是必要情况下,也是可以互相通信的。
Kubernetes中的集群默认会有一个叫default的namespace。实际上,应该是3个:
- default:你的service和app默认被创建于此。
- kube-system:kubernetes系统组件使用。
- kube-public:公共资源使用。但实际上现在并不常用。
命令 kubectl get ns 可查看命名空间。
ubuntu@k8s-master:~$ kubectl get ns
NAME STATUS AGE
default Active 42h
kube-node-lease Active 42h
kube-public Active 42h
kube-system Active 42h
所有没有指定namespace下,集群都默认在default 命名空间。
2、创建Namespace
两种方式:命令和yaml文件
1)命令:kubectl create namespace test
2)使用yaml文件:
sudo vim namespace.yaml
kind: Namespace
apiVersion: v1
metadata:
name: test
labels:
name: test
然后,执行kubectl apply -f namespace.yaml
3、在namespace中创建资源
也有两种方式:
1)命令最后指定命名空间:kubectl apply -f pod.yaml --namespace=test
2)在yaml文件指定:
apiVersion: v1
kind: Pod
metadata:
name: mypod
namespace: test #指定命名空间
labels:
name: mypod
spec:
containers:
- name: mypod
image: nginx
一旦指定命名空间后,在查看Pod或者Service,也必须指定命名空间,否则查看不到,因为没指定之前,所有命令默认是default的命名空间。
查看test命名空间的pod
kubectl get pods --namespace=test
4、kubens切换namespace
如上所示,所有命令默认是default的命名空间,所有用其他命名空间,必须指定命令。所以可以切换至命名空间,就不需要在命令后指定了。
所以需要用到插件kubens,插件地址:https://github.com/ahmetb/kubectx#manual-installation-macos-and-linux
这里面包含两个插件,需要的话都可以安装。下载安装:
sudo git clone https://github.com/ahmetb/kubectx /opt/kubectx
sudo ln -s /opt/kubectx/kubectx /usr/local/bin/kubectx
sudo ln -s /opt/kubectx/kubens /usr/local/bin/kubens
安装完成,当你运行 kubens 命令,它会高亮当前的namespace,
切换test空间, kubens test ,再次查看所在空间,已切换完成,查看test所在空间的资源,输入命令也无需在次指定test的命名空间。
五、yaml参数参考(参考)
apiVersion: v1 #指定api版本,此值必须在kubectl apiversion,命令kubectl api-versions可查看
kind: Pod #指定创建资源的角色/类型
metadata: #资源的元数据/属性
name: django-pod #资源的名字,在同一个namespace中必须唯一
labels: #设定资源的标签,使这个标签在service网络中备案,以便被获知
k8s-app: django
version: v1
kubernetes.io/cluster-service: "true"
annotations: #设置自定义注解列表
- name: String #设置自定义注解名字
spec: #设置该资源的内容
restartPolicy: Always #表示自动重启,一直都会有这个容器运行
nodeSelector: #选择node节点14 zone: node1
containers:
- name: django-pod #容器的名字
image: django:v1.1 #容器使用的镜像地址
imagePullPolicy: Never #三个选择Always、Never、IfNotPresent,每次启动时检查和更新(从registery)images的策略,
# Always,每次都检查
# Never,每次都不检查(不管本地是否有)
# IfNotPresent,如果本地有就不检查,如果没有就拉取
command: ['sh'] #启动容器的运行命令,将覆盖容器中的Entrypoint,对应Dockefile中的ENTRYPOINT
args: ["$(str)"] #启动容器的命令参数,对应Dockerfile中CMD参数
env: #指定容器中的环境变量
- name: str #变量的名字
value: "/etc/run.sh" #变量的值
resources: #资源管理
requests: #容器运行时,最低资源需求,也就是说最少需要多少资源容器才能正常运行
cpu: 0.1 #CPU资源(核数),两种方式,浮点数或者是整数+m,0.1=100m,最少值为0.001核(1m)
memory: 32Mi #内存使用量
limits: #资源限制
cpu: 0.5
memory: 32Mi
ports:
- containerPort: 8080 #容器开发对外的端口
name: uwsgi #名称
protocol: TCP
livenessProbe: #pod内容器健康检查的设置
httpGet: #通过httpget检查健康,返回200-399之间,则认为容器正常
path: / #URI地址
port: 8080
#host: 127.0.0.1 #主机地址
scheme: HTTP
initialDelaySeconds: 180 #表明第一次检测在容器启动后多长时间后开始
timeoutSeconds: 5 #检测的超时时间
periodSeconds: 15 #检查间隔时间
#也可以用这种方法
#exec: 执行命令的方法进行监测,如果其退出码不为0,则认为容器正常
# command:
# - cat
# - /tmp/health
#也可以用这种方法
#tcpSocket: //通过tcpSocket检查健康
# port: number
lifecycle: #生命周期管理(钩子)
postStart: #容器运行之前运行的任务
exec:
command:
- 'sh'
- 'yum upgrade -y'
preStop: #容器关闭之前运行的任务
exec:
command: ['service httpd stop']
volumeMounts: #挂载设置
- name: volume #挂载设备的名字,与volumes[*].name 需要对应
mountPath: /data #挂载到容器的某个路径下
readOnly: True
volumes: #定义一组挂载设备
- name: volume #定义一个挂载设备的名字
#meptyDir: {}
hostPath:
path: /opt #挂载设备类型为hostPath,路径为宿主机下的/opt
- 上一篇:Nginx 如何配置 SSL
- 下一篇:Nginx安全相关配置常用教程
相关推荐
- 大文件传不动?WinRAR/7-Zip 入门到高手,这 5 个技巧让你效率翻倍
-
“这200张照片怎么传给女儿?微信发不了,邮箱附件又超限……”62岁的张阿姨对着电脑犯愁时,儿子只用了3分钟就把照片压缩成一个文件,还教她:“以后用压缩软件,比打包行李还方便!”职场人更懂这...
- 电脑解压缩软件推荐——7-Zip:免费、高效、简洁的文件管理神器
-
在日常工作中,我们经常需要处理压缩文件。无论是下载软件包、接收文件,还是存储大量数据,压缩和解压缩文件都成为了我们日常操作的一部分。而说到压缩解压软件,7-Zip绝对是一个不可忽视的名字。今天,我就来...
- 设置了加密密码zip文件要如何打开?这几个方法可以试试~
-
Zip是一种常见的压缩格式文件,文件还可以设置密码保护。那设置了密码的Zip文件要如何打开呢?不清楚的小伙伴一起来看看吧。当我们知道密码想要打开带密码的Zip文件,我们需要用到适用于Zip格式的解压缩...
- 大文件想要传输成功,怎么把ZIP文件分卷压缩
-
不知道各位小伙伴有没有这样的烦恼,发送很大很大的压缩包会受到限制,为此,想要在压缩过程中将文件拆分为几个压缩包并且同时为所有压缩包设置加密应该如何设置?方法一:使用7-Zip免费且强大的文件管理工具7...
- 高效处理 RAR 分卷压缩包:合并解压操作全攻略
-
在文件传输和存储过程中,当遇到大文件时,我们常常会使用分卷压缩的方式将其拆分成多个较小的压缩包,方便存储和传输。RAR作为一种常见的压缩格式,分卷压缩包的使用频率也很高。但很多人在拿到RAR分卷...
- 2个方法教你如何删除ZIP压缩包密码
-
zip压缩包设置了加密密码,每次解压文件都需要输入密码才能够顺利解压出文件,当压缩包文件不再需要加密的时候,大家肯定想删除压缩包密码,或是忘记了压缩包密码,想要通过删除操作将压缩包密码删除,就能够顺利...
- 速转!漏洞预警丨压缩软件Winrar目录穿越漏洞
-
WinRAR是一款功能强大的压缩包管理器,它是档案工具RAR在Windows环境下的图形界面。该软件可用于备份数据,缩减电子邮件附件的大小,解压缩从Internet上下载的RAR、ZIP及其它类...
- 文件解压方法和工具分享_文件解压工具下载
-
压缩文件减少文件大小,降低文件失效的概率,总得来说好处很多。所以很多文件我们下载下来都是压缩软件,很多小伙伴不知道怎么解压,或者不知道什么工具更好,所以今天做了文件解压方法和工具的分享给大家。一、解压...
- [python]《Python编程快速上手:让繁琐工作自动化》学习笔记3
-
1.组织文件笔记(第9章)(代码下载)1.1文件与文件路径通过importshutil调用shutil模块操作目录,shutil模块能够在Python程序中实现文件复制、移动、改名和删除;同时...
- Python内置tarfile模块:读写 tar 归档文件详解
-
一、学习目标1.1学习目标掌握Python内置模块tarfile的核心功能,包括:理解tar归档文件的原理与常见压缩格式(gzip/bz2/lzma)掌握tar文件的读写操作(创建、解压、查看、过滤...
- 使用python展开tar包_python拓展
-
类Unix的系统,打包文件经常使用的就是tar包,结合zip工具,可以方便的打包并解压。在python的标准库里面有tarfile库,可以方便实现生成了展开tar包。使用这个库最大的好处,可能就在于不...
- 银狐钓鱼再升级:白文件脚本化实现GO语言后门持久驻留
-
近期,火绒威胁情报中心监测到一批相对更为活跃的“银狐”系列变种木马。火绒安全工程师第一时间获取样本并进行分析。分析发现,该样本通过阿里云存储桶下发恶意文件,采用AppDomainManager进行白利...
- ZIP文件怎么打开?2个简单方法教你轻松搞定!
-
在日常工作和生活中,我们经常会遇到各种压缩文件,其中最常见的格式之一就是ZIP。ZIP文件通过压缩数据来减少文件大小,方便我们进行存储和传输。然而,对于初学者来说,如何打开ZIP文件可能会成为一个小小...
- Ubuntu—解压多个zip压缩文件.zip .z01 .z02
-
方法将所有zip文件放在同一目录中:zip_file.z01,zip_file.z02,zip_file.z03,...,zip_file.zip。在Zip3.0版本及以上,使用下列命令:将所有zi...
- 如何使用7-Zip对文件进行加密压缩
-
7-Zip是一款开源的文件归档工具,支持多种压缩格式,并提供了对压缩文件进行加密的功能。使用7-Zip可以轻松创建和解压.7z、.zip等格式的压缩文件,并且可以通过设置密码来保护压缩包中的...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)