业务系统与中间件k8s容器化部署实践——
redis+nodejsspringboot单体应⽤
1.1创建创建⼀个namespace,缺省为default,创建套路kubectl apply -f XX.yaml
apiVersion: v1
kind: Namespace
metadata:
name: redis-namespace
1.2创建⼀个configmap,建议去掉f原配置⽂件⾥的注释,减少etcd存储消耗
kubectl create configmap redis-configmap --from-file=/f -n redis-namespace
1.3宿主机/f配置⽂件
dir /data
requirepass 12345
pidfile /data/redis.pid
port 6379
tcp-backlog 30000
timeout 0
tcp-keepalive 10
loglevel notice
logfile /data/redis.log
databases 16
#save 900 1
#save 300 10
#save 60 10000
stop-writes-on-bgsave-error no
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
slave-priority 100
maxclients 30000
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events KEA
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-entries 512
list-max-ziplist-value 64
set-max-intset-entries 1000
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
1.4创建⼀个deployment ,创建套路kubectl apply -f XXX.yaml ,这⾥数据卷⼀个挂载上⾯定义的configmap,⼀个宿主机hostPath
apiVersion: extensions/v1beta1 #注意v1版本不⽀持Deployment
kind: Deployment
metadata:
name: redis-deployment
namespace: redis-namespace #使⽤⾃定义namespace
spec:
replicas: 1
template:
metadata:
labels:
name: redis-label
spec:
containers:
- name: redis-container
image: redis
volumeMounts:
-
name: myconfigmap #与volumes的name对应
mountPath: "/usr/local/etc" #与vomums的key为f的path拼接得到容器内redis配置⽂件绝对路径
- name: redis-data #容器内挂载点名称
mountPath: /data #容器内data保持路径,该路径在f配置了
command:
- "redis-server" #启动命令
args:
- "/usr/local/etc/f" #带配置⽂件启动
volumes:
- name: myconfigmap
configMap:
name: redis-configmap #指定使⽤的configmap
items:
- key: f #该值为configmap创建--from-file的⽂件名
path: f
- name: redis-data #数据卷名称,需要与容器内挂载点名称⼀致
hostPath:
path: /var/lib/redis #将容器挂载点名称相同的path挂载到宿主机path(但这种⽅式有局限性,pod分配到其它node数据就丢失了,需要挂载到NFS⽂件系统?)1.5测试
#查看
kubectl get pods -n redis-namespace -o wide
#进⼊容器访问
kubectl exec -it redis-deployment-556c5d85bb-vxv6b /bin/bash -n redis-namespace
#redis操作测试nodeselector
连接redis-cli 认证auth 12345 查看数据⽬录:/var/lib/redis
#暴露redis-deployment这个服务,⽅便后⾯被其它k8s容器,并暴露⼀个外⽹端⼝(正式环境⼀般中间件不暴露外⽹端⼝)
kubectl expose deployment redis-deployment -n redis-namespace --port=6379 --type=LoadBalancer
#检查该服务
kubectl get service -n redis-namespace
内容为redis-deployment LoadBalancer 10.1.59.127 <pending> 6379:30753/TCP
测试连接:telnet 127.0.0.1 30753 telnet 10.1.59.127 6379
2.业务应⽤ k8s部署
为⽅便这⾥以nodejs为例,Java应⽤类似.
2.1.需要node环境,node -v ,没有就安装⼀下yum install node -y
2.2 nodejs业务程序,⽂件内容如下
var handleRequest = function(request, response) {
console.log('Received request for URL: ' + request.url);
response.writeHead(200);
};
var www = ateServer(handleRequest);
www.listen(8080);
2.3 直接启动⼀下:node server.js,测试:curl 127.0.0.1:8080
2.4 在service.js同级⽬录,创建Dockerfile,如果使⽤java可使⽤基础镜像FROM java:8,⽂件内容如下
FROM node:6.9.2
EXPOSE 8080
COPY server.js .
CMD node server.js
2.5 镜像构建并推送到docker registry私库
1.安装registry仓库
docker run -d -v /opt/registry:/var/lib/registry -p 5000:5000 --name myregistry registry:2
2.构建nodejs应⽤镜像192.168.20
3.134:5000/hello-world:v1
docker build -t 192.168.203.134:5000/hello-world:v1 .
docker push 192.168.203.134:5000/hello-world:v1 .
3.docker push默认⾛https协议,如果要http协议push,需要配置/etc/docker/daemon.json,内容为:{
"registry-mirrors": ["5c3uuctj.mirror.aliyuncs","163", "reg-mirror.qiniu"],
"insecure-registries":["192.168.203.134:5000"]
}
4.重启:systemctl restart docker && docker restart myregistry ,再推送
docker push 192.168.203.134:5000/hello-world:v1 .
5.检查⼀下
curl 192.168.203.134:5000/v2/_catalog
2.6 k8s 部署hello-world
1.启动容器
kubectl run hello-world --image=192.168.203.134:5000/hello-world:v2 --port=8080
2.暴露该服务⼀个外⽹可访问的随机IP
kubectl expose deployment hello-world --type=LoadBalancer
3.查看与测试
kubectl get services
curl 192.168.203.134:随机IP 或 ClusterIp:8080
3.k8s业务容器访问k8s redis容器
3.1代码修改,引⼊redis模块,service.js⽬录npm install redis安装redis依赖,使⽤nodejs读写redis,连接参数REDIS_PORT,REDIS_HOST从环境变量读取:v.REDIS_PORT,v.REDIS_HOST
var redis=require('redis');
var handleRequest = function(request, response) {
console.log('Received request for URL: ' + request.url);
RDS_PORT = v.REDIS_PORT,
RDS_HOST = v.REDIS_HOST,
RDS_OPTS = {auth_pass:12345} ,
client = ateClient(RDS_PORT, RDS_HOST, RDS_OPTS);
<('ready', function(res){
console.log('redis连接事件')
})
client.set("now",new Date(),redis.print);
<("now", function(err, reply){
console.log(reply);
response.writeHead(200);
})
};
var www = ateServer(handleRequest);
www.listen(8080);
3.2 修改Dockerfile,CMD命令增加npm intall redis,否则后⾯启动k8s应⽤容器报错缺少redis模块(kubectl logs POD名称)
FROM node:6.9.2
EXPOSE 8080
COPY server.js .
CMD npm install redis && node server.js
3.3重新构建推送私库并k8s部署
1.重新构建并推送
docker build -t 192.168.203.134:5000/hello-world:v2 .
docker push 192.168.203.134:5000/hello-world:v2
2.更新k8s hello-world服务的镜像,重新kubectl apply -f XXX.yaml,
或kubectl set image deployment/hello-world hello-world=192.168.203.134:5000/hello-world:v2
3.查看⽇志
kubectl get service,pod 获取pod名称
kubectl logs --tail 222 -f pod/hello-world-699d4b48cb-r4tpb 进⾏动态查看⽇志
⽇志内容是这样的,因为service.js的redis连接参数需要读取环境变量v.REDIS_v.REDIS_HOST,⽽通过kubectl run xx kubectl expose xx这样直接部署⼀个deployment不便指定环境变量及其它,需要使⽤yaml配置⽂件⽅式启动
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论