服务介绍
- t-sc 服务依赖于mysql
- t-kateway 服务依赖于t-sc
docker镜像推送
下载mysql 5.7镜像
制作sc kateway镜像
参考任意节点登录harbor并推送镜像到harbor仓库将镜像推送到harbor仓库
k8sMaster获取登录私服Harbor的秘钥
docker login 192.168.10.102
## admin Harbor12345
在/root/.docker/config.json里面有一个秘钥
cat /root/.docker/config.json | base64 -w 0
==>得到: ewoJImF1dGhzIjogewoJCSIxOTIuMTY4LjEwLjEwMiI6IHsKCQkJImF1dGgiOiAiWVdSdGFXNDZTR0Z5WW05eU1USXpORFU9IgoJCX0KCX0KfQ==
K8sMaster节点任意目录
vim secret.yaml
修改其中的dockerconfigjson为上面获取到的值
apiVersion: v1
kind: Secret
metadata:
name: login
type: kubernetes.io/dockerconfigjson
data:
.dockerconfigjson: ewoJImF1dGhzIjogewoJCSIxOTIuMTY4LjEwLjEwMiI6IHsKCQkJImF1dGgiOiAiWVdSdGFXNDZTR0Z5WW05eU1USXpORFU9IgoJCX0KCX0KfQ==
运行login应用
kubectl apply secret.yaml
创建yaml文件
创建项目文件夹
mkdir /root/mytest
mkdir -p /root/mytest/t-gateway
mkdir -p /root/mytest/t-mysql
mkdir -p /root/mytest/t-sc
t-mysql的deployment和service配置创建
cd /root/mytest/t-mysql
vim deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: t-mysql-deployment
spec:
replicas: 1
selector:
matchLabels:
app: t-mysql
env: testing
template:
metadata:
labels:
app: t-mysql
env: testing
spec:
containers:
- name: t-mysql
image: 192.168.10.102/lwg/mysql ## harbor仓库中的mysql镜像和tag(这里是latest)
ports:
- name: mysql-port
containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
value: "123456"
imagePullSecrets: ## 登录harbor的秘钥
- name: login
cd /root/mytest/t-mysql
vim service.yaml
apiVersion: v1
kind: Service
metadata:
name: t-mysql-service
labels:
app: t-mysql
env: testing
spec:
ports:
- protocol: TCP
port: 3306
targetPort: 3306
nodePort: 30006 ## 这个端口可以暴露出来,在windows上可以访问到
type: NodePort
selector:
app: t-mysql
env: testing
t-sc的deployment和service配置创建
cd /root/mytest/t-sc
vim deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: t-service-deployment
spec:
replicas: 1
selector:
matchLabels:
app: t-service
env: testing
template:
metadata:
labels:
app: t-service
env: testing
spec:
containers:
- name: t-service
image: 192.168.10.102/lwg/service:3.0 ## harbor仓库地址中的镜像
ports:
- name: service-port
containerPort: 8020
env:
- name: DATA_SOURCE_IP ## 配置一个环境变量名,然后在t-sc服务的application.yml中可以获取到
value: t-mysql-service ## 使用mysql pod的metadata.name可以代理到pod中访问到mysql
imagePullSecrets: ## 配置登录harbor的秘钥
- name: login
cd /root/mytest/t-sc
vim service.yaml
apiVersion: v1
kind: Service
metadata:
name: t-service-service
labels:
app: t-service
env: testing
spec:
ports:
- protocol: TCP
port: 8020
targetPort: 8020
nodePort: 30020
type: NodePort
selector:
app: t-service
env: testing
其中 t-sc是一个springboot项目,它的aplication.yml如下:
server:
port: 8020
spring:
datasource:
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://${DATA_SOURCE_IP}:3306/test?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&failOverReadOnly=false
t-gateway的deployment和service配置创建
cd /root/mytest/t-gateway
vim deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: t-gateway-deployment
spec:
replicas: 1
selector:
matchLabels:
app: t-gateway
env: testing
template:
metadata:
labels:
app: t-gateway
env: testing
spec:
containers:
- name: t-gateway
image: 192.168.10.102/lwg/kateway:2.0
volumeMounts:
- name: wwwroot
mountPath: /work
ports:
- name: gateway-port
containerPort: 8030
env:
- name: SERVER_IP
value: t-service-service
imagePullSecrets:
- name: login
volumes: ##创建一个挂载卷(把nfs服务器上的/data/nfs/work挂载到容器内部的/work目录)
- name: wwwroot
nfs:
server: 192.168.10.105
path: /data/nfs/work
cd /root/mytest/t-gateway
vim service.yaml
apiVersion: v1
kind: Service
metadata:
name: t-gateway-service
labels:
app: t-gateway
spec:
ports:
- protocol: TCP
port: 8030
targetPort: 8030
nodePort: 30030
type: NodePort
selector:
app: t-gateway
env: testing
其中,t-gateway的application.properties如下:
server.port=8030
test.list.url=http://${SERVER_IP}:8020
启动应用
启动应用:
cd /root
kubectl apply -R -f mytest/
访问应用:任意节点:30030/api访问
如何挂载一个配置文件到容器内部
方式1:如果是文本文件,使用configmap的方式
1)创建一个configmap
提前创建一个index.html
kubectl create configmap index-html --from-file index.html
2)deployment.yaml文件:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx-deploy
name: nginx-deploy
spec:
replicas: 1
selector:
matchLabels:
app: nginx-deploy
strategy: {}
template:
metadata:
labels:
app: nginx-deploy
spec:
containers:
- image: nginx
name: nginx-deploy
volumeMounts: #挂载
- mountPath: "/usr/share/nginx/html/index2.html" # 挂载到具体容器内部的文件全目录,包括文件名
name: sample-volumn # 关联挂载数据卷
subPath: index2.html # 如果有了这个配置,就可以关联到具体的文件,名称和文件名完全一样。如果没有这个配置,那么configmap生成的文件怪哉到上面的目录!!!并且这个目录里面只有这一个文件
volumes: # 定义一个数据卷
- name: sample-volumn # 给定一个数据卷的名称
configMap: # 使用configmap类型
name: index-html # 关联春根据的configma
方式2:采用上面部署t-gateway的方式,但是一定要使用和configmap一样的subPath属性,才能挂载成一个文件
K8S常用命令
-
1.直接创建一个pod并运行(运行一个deployment): kubectl create deployment web --image=nginx [其中metadata.name=web]
-
2.对创建好的pod暴露一个端口(运行一个service): kubectl expose deployment web --port=80 --type=NodePort --target-port=80 --name=web1
-
3.使用deployment和yml创建一个可外部访问的pod: 1)生成一个yaml模板文件: kubectl create deployment web --image=nginx --dry-run -o yaml > web.yaml
2)使用yaml文件部署应用: kubectl apply -f web.yaml
3)对外进行发布(暴露端口号)yaml模板生成: kubectl expose deployment web --port=80
–type=NodePort --target-port=80 --name=web1 -o yaml > web1.yaml 4)执行发布: kubectl apply -f web1.yaml 5)可以使用任意的node节点,加上暴露的端口去访问。 -
4.获取查看命令: kubectl describe pod : 查看一个pod的运行情况 kubectl get pods -n namespace [kubectl get pods --all-namespaces] kubectl get
deployment : 获取所有的deployment kubectl get svc : 获取所有的service -
5.删除相关: kubectl delete deployment xxx : 删除一个deployment [kubectl delete deployment --all] kubectl delete svc xxx : 删除一个service
[kubectl delete svc --all] kubectl delete pod pod : 删除一个pod kubectl
delete deployment xxx kubectl delete pod PODNAME -n NAMESPACE
–grace-period=0 --force : 强制删除一个pod -
6.帮助命令: kubectl --help kubectl get --help
-
7.有状态服务:注册中心nacos/mysql一般直接搭建在机器上(这种都是主从架构),不适合用k8s部署。
-
8.重启一个pod: kubectl get pod {podname} -n {namespace} -o yaml | kubectl replace --force -f -