本文最后更新于:2022年12月10日 下午
概述:
记录云原生项目部署中的一些事项,从k8s部署到镜像打包推送(使用docker)
docker
常用指令
运行在虚拟机ubuntu20.04上
1 2 3 4 5 6
| docker build -t getting-started .
docker run -d -p 80:6379 --name redis redis:lastest
|
更新源码后,需要先删除旧容器,再启动新容器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| docker ps
docker stop <the-container-id>
docker rm <the-container-id>
docker rm -f <the-container-id>
docker run -dp 3000:3000 getting-started
|
使用卷实现持久化数据,更换容器后被存储的数据不会改变
1 2 3 4 5 6 7
| docker volume create todo-db
docker run -dp 3000:3000 -v todo-db:/etc/todos getting-started
|
docker compose使用
1 2 3 4 5
| # 检查是否安装上 docker compose version
# 启动应用程序栈,-d在后台运行所有内容 docker compose up -d
|
安装与使用镜像
1. 找镜像。
在docker hub找所需的镜像,找不同版本可以点击tag查找所需版本
1 2 3 4 5 6 7 8 9 10 11 12
| docker pull nginx
docker pull nginx:1.20.1
docker images
docker rmi 镜像名:版本号/镜像id
docker rm 镜像
|
2. 启动容器
1 2 3 4 5 6 7 8 9 10 11 12 13
| docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
--restart-always
-p 88:80
docker ps
docker ps -a
docker rm 容器id/名称
|
3. 进入容器修改内容
1 2
| docker exec -it 容器id /bin/bash
|
4. 提交改变
1 2 3 4 5
| docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
docker commit -a "作者" -m "提交变化" 容器id 自定义名称
|
5. 远程使用
- 打包成一个压缩包tar后传输给另一个机器,另一个机器再解压运行即可
1 2 3 4 5
| docker save -o 自定义名称 镜像
docker load -i 上一步定义的名称
|
- 推送到远程仓库,需要先
docker login
登录,并且dockerhub上有自己的仓库(docker logout
登出)1 2
| docker tag <local-image:tagname> <new-repo:tagname> docker push <new-repo:tagname>
|
6. 将数据挂载到外部
1 2 3 4 5 6 7 8 9
| docker run --name some-nginx -v /some/content:/usr/share/nginx/html:ro --restart=always -d nginx
docker run --name my-nginx \ -v /host/path/nginx.conf:/etc/nginx/nginx.conf:ro -d nginx
|
挂载一个redis
1 2 3 4 5 6 7 8
| docker run -v /data/redis/redis.conf:/etc/redis/redis.conf \ -v /data/redis/data:/data \ -d --name myredis \ -p 6379:6379 \ redis:latest redis-server /etc/redis/redis.conf
|
7. 杂项
1 2 3 4 5
| docker logs 容器id
docker cp 容器id:文件绝对路径 外部路径
|
在docker运行期间操作防火墙需要重启docker
systemctl restart docker
打包并使用镜像
编写Dockerfile,示例如下
1 2 3 4 5
| FROM docker pull openjdk:8-jdk-slim LABEL maintainer=yedeng COPY target/*.jar /app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
|
在当前目录下开始打包(必须要有docker环境),打包结束后可以使用docker images
查看
1 2 3
| docker build -t java-demo:v1.0 .
|
设置主机名
hostnamectl set-hostname 自定义名称
kubernetes
部分概念类似于docker,但k8s具有自愈、负载均衡等自动调整的能力
常用指令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| kubectl get nodes
kubectl get pod -owide
kubectl describe pod <pod-name> kubectl describe pod -n <namespace> <pod-name>
kubectl apply -f <calico.yaml>
kubectl delete -f <ingress.yaml>
kubectl cluster-info
|
可视化工具dashboard
dashboard
1
| kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml
|
安装与使用
安装教程
安装步骤
部署中遇到/proc/sys/net/ipv4/ip_forward
为0的问题
解决方法
部署网络组件calico时,应使用获取对应版本(部署使用1.20.9版本)的calico.yaml
curl https://docs.projectcalico.org/v3.20/manifests/calico.yaml -O
部署metrics之后使用kubectl top nodes
显示服务不可获取
参考资料
devops中使用apache下载,改为阿里云镜像
在ks-devops-agent配置文件修改MavenSetting
1 2 3 4 5 6
| <mirror> <id>nexus-aliyun</id> <name>Nexus aliyun</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <mirrorOf>central</mirrorOf> </mirrors>
|
部署
部署:(Deployment)
有状态副本集:中间件(StatefulSet)
守护进程集:(DaemonSet)日志收集
Deployment
通过deployment部署的应用,只有删除deployment才能删除pod(直接删除pod将重启pod)
具有多副本、扩缩容、自愈、故障转移、滚动更新、版本回退能力
命令行部署kubectl create deployment <mytomcat> --image=<tomcat:8.5.68>
查看部署kubectl get deploy
yaml配置部署
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| apiVersion: apps/v1 kind: Deployment metadata: labels: app: my-dep name: my-dep spec: replicas: 3 selector: matchLabels: app: my-dep template: metadata: labels: app: my-dep spec: containers: - image: nginx name: nginx
|
命名空间
获取命名空间kubectl get ns
命令行创建
1 2
| kubectl create ns hello kubectl delete ns hello
|
通过yaml文件
1 2 3 4
| apiVersion: v1 kind: Namespace metadata: name: hello
|
Pod
命令行创建,与docker类似kubectl run mynginx --image=nginx
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| kubectl get pod
kubectl describe pod <pod-name>
kubectl delete pod <pod-name> -n <namespace>
kubectl logs <pod-name>
kubectl get pod -owide
curl 192.168.169.136
|
访问pod的bash,也可以使用dashboard选择’执行’访问
1
| kubectl exec -it <pod-name> -- /bin/bash
|
通过yaml创建
1 2 3 4 5 6 7 8 9 10 11
| apiVersion: v1 kind: Pod metadata: labels: run: mynginx name: mynginx namespace: default spec: containers: - image: nginx name: mynginx
|
一个pod两个容器(两个image),一个pod有一个内部ip,多个容器共用这个ip,通过不同的端口区分
1 2 3 4 5 6 7 8 9 10 11 12
| apiVersion: v1 kind: Pod metadata: labels: run: myapp name: myapp spec: containers: - image: nginx name: nginx - image: tomcat:8.5.68 name: tomcat
|
Service
仅限集群内部访问
获取所有暴露的服务kubectl get service
删除某个servicekubectl delete service <service-name>
选择一次部署,统一部署pod使用的ip(任意)(在集群内的机器上可以通过该方法访问)
也可以在容器内部,使用域名访问,域名为:服务名.命名空间.svc(在机器上无法使用域名访问)
1 2 3 4 5
| kubectl expose deployment <my-dep> --port=8000 --target-port=80 --type=ClusterIP
kubectl get pod -l app=my-dep
|
暴露服务有两种方式ClusterIP和NodeIP
ClusterIP
NodePort
集群外部可访问
nodeport在每个集群都会开放一个端口,开放的端口范围在30000-32767,可访问任意一台机器的ip:对应端口
1
| kubectl expose deployment my-dep --port=8000 --target-port=80 --type=NodePort
|
通过yaml文件暴露端口
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| apiVersion: v1 kind: Service metadata: labels: app: my-dep name: my-dep spec: ports: - port: 8000 protocol: TCP targetPort: 80 selector: app: my-dep type: NodePort
|
Ingress
相当于网关层
查看规则kubectl get ingress
可简写为kubectl get ing
修改规则kubectl edit ing <name>
配置通过域名访问服务
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress-host-bar spec: ingressClassName: nginx rules: - host: "hello.atguigu.com" http: paths: - pathType: Prefix path: "/" backend: service: name: hello-server port: number: 8000
|
存储持久化
NFS
一个文件系统
实现k8s主从节点共享
在k8s的主节点运行
1 2 3 4 5 6 7 8 9 10
| echo "/nfs/data/ *(insecure,rw,sync,no_root_squash)" > /etc/exports
mkdir -p /nfs/data
systemctl enable rpcbind --now
systemctl enable nfs-server --now
exportfs -r
|
删除部署之后,文件系统内的东西不会自动清理
将部署中的/usr/share/nginx/html
路径下内容挂载到/nfs/data/nginx-pv
(nfs路径,需要装好nfs文件系统)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| apiVersion: apps/v1 kind: Deployment metadata: labels: app: nginx-pv-demo name: nginx-pv-demo spec: replicas: 2 selector: matchLabels: app: nginx-pv-demo template: metadata: labels: app: nginx-pv-demo spec: containers: - image: nginx name: nginx volumeMounts: - name: html mountPath: /usr/share/nginx/html volumes: - name: html nfs: server: 172.31.0.4 path: /nfs/data/nginx-pv
|
PV&PVC
PV:持久卷(Persistent Volume),将应用需要持久化的数据保存到指定位置
PVC:持久卷申明(Persistent Volume Claim),申明需要使用的持久卷规格
二者配合使用,能够为应用分配指定大小空间;当pod删除时,其对应的存储空间也会删除
静态供应创建好PV池,申请时在内部选择
查看创建的pv池kubectl get pv
创建PV
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| apiVersion: v1 kind: PersistentVolume metadata: name: pv01-100m spec: capacity: storage: 100M accessModes: - ReadWriteMany storageClassName: nfs nfs: path: /nfs/data/01 server: 10.0.4.17 --- apiVersion: v1 kind: PersistentVolume metadata: name: pv02-3gi spec: capacity: storage: 3Gi accessModes: - ReadWriteMany storageClassName: nfs nfs: path: /nfs/data/02 server: 10.0.4.17 --- apiVersion: v1 kind: PersistentVolume metadata: name: pv03-5gi spec: capacity: storage: 5Gi accessModes: - ReadWriteMany storageClassName: nfs nfs: path: /nfs/data/03 server: 10.0.4.17
|
PVC相当于申请书,用于申请空间
动态供应申请时自动创建PV
ConfigMap
配置统一管理
将redis.conf文件制作为configmap
1
| kubectl create cm redis-conf --from-file=redis.conf
|
以上指令等价于一下yaml
1 2 3 4 5 6 7 8
| apiVersion: v1 data: redis.conf: | appendonly yes kind: ConfigMap metadata: name: redis-conf namespace: default
|
在部署redis时使用配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| apiVersion: v1 kind: Pod metadata: name: redis spec: containers: - name: redis image: redis command: - redis-server - "/redis-master/redis.conf" ports: - containerPort: 6379 volumeMounts: - mountPath: /data name: data - mountPath: /redis-master name: config volumes: - name: data emptyDir: {} - name: config configMap: name: redis-conf items: - key: redis.conf path: redis.conf
|
Secret
用于保存敏感信息
查看kubectl get secret
1 2 3 4
| kubectl create secret docker-registry leifengyang-docker \ --docker-username=leifengyang \ --docker-password=Lfy123456 \ --docker-email=534096094@qq.com
|
使用保存的secret下载镜像yaml
1 2 3 4 5 6 7 8 9 10
| apiVersion: v1 kind: Pod metadata: name: private-nginx spec: containers: - name: private-nginx image: leifengyang/guignginx:v1.0 imagePullSecrets: - name: leifengyang-docker
|