博主昵称:跳楼梯企鹅
博主主页面链接:博主主页传送门博主专栏页面连接:专栏传送门--网路安全技术
创作初心:本博客的初心为与技术朋友们相互交流,每个人的技术都存在短板,博主也是一样,虚心求教,希望各位技术友给予指导。
博主座右铭:发现光,追随光,成为光,散发光;
博主研究方向:渗透测试、机器学习 ;
博主寄语:感谢各位技术友的支持,您的支持就是我前进的动力 ;
本篇文章分为3次分享完
数据卷 是一个可供一个或多个容器使用的特殊目录,实现让容器中的一个目录和宿主机中的一个文件或者目录进行绑定。数据卷 是被设计用来持久化数据的。
(1)bind mount volume
(2)Docker Management Volume
(3)Container Data (基于现有的容器)
(1)bind mount volume
- 1.创建本地目录
- root@123
- mkdir /webroom
- root@123 ~
- echo "123" > /webroom/index.html
-
- 2.挂载和运行容器
- docker run -v # 挂载数据卷 Bind mount a volume
- root123-z ~
- docker run -v /webroom:/usr/share/nginx/html -d -P nginx
- root123-z ~
- docker ps -q
-
- 3.查看bind
- root@123 /webroom
- docker inspect 553d7e454376|grep "Mounts" -A7
- "Mounts": [
- {
- "Type": "bind",
- "Source": "/webroom",
- "Destination": "/usr/share/nginx/html",
- "Mode": "",
- "RW": true,
- "Propagation": "rprivate"
- root@123 /webroom
- docker inspect 553d7e454376|grep IPAddress
- "SecondaryIPAddresses": null,
- "IPAddress": "ip地址",
- "IPAddress": "ip地址",
-
- 4.验证
- root@123 ~
- curl ip地址
- 1.开启容器
- root@123 ~
- docker run -v /usr/share/nginx/html -d -P nginx
- root@123 ~
- docker ps -q
-
- 2.查看配置
- root@123 ~
- docker inspect acc5955cc2db |grep "Mounts" -A7
- "Mounts": [
- {
- "Type": "volume",
- "Name": "7f9f40b822f3353819401c0dc2df116f732c1e9ae839433d3de61d03fd84eccd",
- "Source": "/var/lib/docker/volumes/7f9f40b822f3353819401c0dc2df116f732c1e9ae839433d3de61d03fd84eccd/_data",
- "Destination": "/usr/share/nginx/html",
- "Driver": "local",
- "Mode": "",
-
-
- 3.查看目录
- root@123 ~
- ls /var/lib/docker/volumes
-
- 4.删除容器
- root@123 ~
- docker stop acc5955cc2db
- acc5955cc2db
- root@123 ~
- docker rm -v acc5955cc2db
-
-
- 5.批量删除其他
- docker volume rm $(docker volume ls -qf dangling=true)
- 1.运行容器
- root@123 ~
- docker run -d --name nginx1 nginx
-
- 2.容器共享
- root@123 ~
- docker run --volumes-from nginx1 -d nginxv
- root@123 ~
- docker volume --help
- Usage: docker volume COMMAND
- Manage volumes
- Commands:
- create Create a volume
- inspect Display detailed information on one or more volumes
- ls List volumes
- prune Remove all unused local volumes
- rm Remove one or more volumes
-
- 1.创建
- root@123 ~
- docker volume create vol1
-
- root@123 ~
- ls /var/lib/docker/volumes/
-
- 2.查询列表
- root@123 ~
- docker volume ls
- DRIVER VOLUME NAME
- local vol1
-
- 3.查看配置信息
- root@123 ~
- docker volume inspect vol1
- [
- {
- "CreatedAt": "2019-08-15T04:48:40-04:00",
- "Driver": "local",
- "Labels": {},
- "Mountpoint": "/var/lib/docker/volumes/vol1/_data",
- "Name": "vol1",
- "Options": {},
- "Scope": "local"
- }
- ]
-
- 4.批量删除
- docker volume rm $(docker volume ls -qf dangling=true)
Ingress 使用开源的反向代理负载均衡器来实现对外暴漏服务,比如 Nginx、Apache、Haproxy等。Nginx Ingress 一般有三个组件组成:
- ingress是kubernetes的一个资源对象,用于编写定义规则。
- 反向代理负载均衡器,通常以Service的Port方式运行,接收并按照ingress定义的规则进行转发,通常为nginx,haproxy,traefik等,本文使用nginx。
- ingress-controller,监听apiserver,获取服务新增,删除等变化,并结合ingress规则动态更新到反向代理负载均衡器上,并重载配置使其生效。
1、nginx:这是方式进行实现
2、Traefik:这种设计就是为微服务这种动态生成而生的
nginx-ingress 模块在运行时主要包括三个主体:NginxController、Store、SyncQueue。
Store 主要负责从 kubernetes APIServer 收集运行时信息,感知各类资源(如 ingress、service等)的变化,并及时将更新事件消息(event)写入一个环形管道。
SyncQueue 协程定期扫描 syncQueue 队列,发现有任务就执行更新操作,即借助 Store 完成最新运行数据的拉取,然后根据一定的规则产生新的 nginx 配置,(有些更新必须 reload,就本地写入新配置,执行 reload),然后执行动态更新操作,即构造 POST 数据,向本地 Nginx Lua 服务模块发送 post 请求,实现配置更新。
NginxController 作为中间的联系者,监听 updateChannel,一旦收到配置更新事件,就向同步队列 syncQueue 里写入一个更新请求。
- 1.安装
- ingress https://kubernetes.github.io/ingress-nginx/
- ingress https://github.com/kubernetes/ingress-nginx
-
- 2.部署
- $ wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.0.0/deploy/static/provider/baremetal/deploy.yaml
-
- 3.配置镜像
- # 修改镜像地址
- $ sed -i 's@k8s.gcr.io/ingress-nginx/controller:v1.0.0\(.*\)@willdockerhub/ingress-nginx-controller:v1.0.0@' deploy.yaml
- $ sed -i 's@k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.0\(.*\)$@hzde0128/kube-webhook-certgen:v1.0@' deploy.yaml
- $ kubectl apply -f deploy.yaml
- $ docker image load -i hzde0128-kube-webhook-certgen-v1.0.tar
- $ docker image load -i willdockerhub-ingress-nginx-controller-v1.0.0.tar
- $ docker images
-
- 4.运行
- $ kubectl apply -f ingress-nginx.yaml
-
- 5.检查是否安装成功
- $ kubectl get pod -n ingress-nginx
- $ kubectl get svc -n ingress-nginx
创建NGINX
- 1.创建目录
-
- $ mkdir -p /opt/ingress/nginx-test
- $ cd /opt/ingress/nginx-test
-
- 2.创建nginx-Deployment-Service.yaml文件
-
- $ cat << EOF > nginx-Deployment-Service.yaml
- apiVersion: apps/v1
- kind: Deployment
- metadata:
- name: nginx-deployment
- labels:
- app: nginx
- spec:
- replicas: 2
- selector:
- matchLabels:
- app: nginx
- minReadySeconds: 1
- progressDeadlineSeconds: 60
- revisionHistoryLimit: 2
- strategy:
- type: RollingUpdate
- rollingUpdate:
- maxSurge: 1
- maxUnavailable: 1
- template:
- metadata:
- labels:
- app: nginx
- spec:
- containers:
- - name: nginx
- image: nginx:1.17.1
- imagePullPolicy: Always
- ports:
- - containerPort: 80
- resources:
- requests:
- memory: "1Gi"
- cpu: "80m"
- limits:
- memory: "1Gi"
- cpu: "80m"
- ---
- apiVersion: v1
- kind: Service
- metadata:
- name: nginx-service
- labels:
- app: nginx
- spec:
- selector:
- app: nginx
- ports:
- - name: nginx-port
- protocol: TCP
- port: 80
- targetPort: 80
- type: ClusterIP
- EOF
-
-
- 3.部署 nginx应用
-
- $ kubectl apply -f nginx-Deployment-Service.yaml
- $ kubectl get svc -o wide|grep nginx-service
- $ kubectl get pod -o wide|grep nginx-deployment-*
-
-
- 4.创建 ingress yaml文件,内容如下:
-
- cat << EOF > nginx-Ingress.yaml
- apiVersion: networking.k8s.io/v1
- kind: Ingress
- metadata:
- name: nginx
- annotations:
- kubernetes.io/ingress.class: "nginx"
- spec:
- rules:
- - host: ingress.nginx.com
- http:
- paths:
- - path: "/"
- pathType: Prefix
- backend:
- service:
- name: nginx-service
- port:
- number: 80
- EOF
-
- 4.创建nginx-Ingress.yaml文件
- $ kubectl apply -f nginx-Ingress.yaml
- $ kubectl get ingress|grep nginx
-
- 5.配置ip
- $ kubectl get ingress|grep nginx
- $ cat /etc/hosts
- $ kubectl get svc -n ingress-nginx
-
- 6.验证
- curl -I http://ingress.nginx.com:端口号
(2)Traefik:这种设计就是为微服务这种动态生成而生的
traefik----系统默认提供
- [root@localhost k8sYmal]# kubectl get pods -n kube-system
- NAME READY STATUS RESTARTS AGE
- helm-install-traefik-crd-gbnq4 0/1 Completed 0 54d
- helm-install-traefik-tp89r 0/1 Completed 0 54d
- metrics-server-86cbb8457f-xspd4 1/1 Running 4 54d
- svclb-traefik-m42nh 2/2 Running 8 54d
- local-path-provisioner-5ff76fc89d-cx49l 1/1 Running 5 54d
- coredns-7448499f4d-9gzt9 1/1 Running 4 54d
- traefik-97b44b794-dsldn 1/1 Running 4 54d
配置:
- 1.安装 Traefik
- $ kubectl apply -f https://www.qikqiak.com/k8strain/network/manifests/traefik/crd.yaml
- $ kubectl apply -f https://www.qikqiak.com/k8strain/network/manifests/traefik/rbac.yaml
- $ kubectl apply -f https://www.qikqiak.com/k8strain/network/manifests/traefik/deployment.yaml
- $ kubectl apply -f https://www.qikqiak.com/k8strain/network/manifests/traefik/dashboard.yaml
-
- 2.traefik 代理------http协议方向
- apiVersion: traefik.containo.us/v1alpha1
- kind: IngressRoute
- metadata:
- name: simpleingressroute
- spec:
- entryPoints:
- - web
- routes:
- - match: Host(`who.qikqiak.com`) && PathPrefix(`/notls`)
- kind: Rule
- services:
- - name: whoami
- port: 80
-
- 3.traefik 代理------tcp协议方向
- [root@localhost k8sYmal]# cat traefik-tcp.yaml
- apiVersion: traefik.containo.us/v1alpha1
- kind: IngressRouteTCP
- metadata:
- name: mongo-traefik-tcp
- spec:
- entryPoints:
- - mongo
- routes:
- - match: HostSNI(`*`)
- services:
- - name: nginx-traefik
- port: 端口号
-
-
StatefulSet是k8s中有状态应用管理的标准实现,今天就一起来了解下其背后设计的场景与原理,从而了解其适用范围与场景。
通常可以分为两大类:有状态与无状态,比如web服务通常都是无状态的,web应用数据主要来自后端存储、缓存等中间件,而本身并不保存数; 而诸如redis、es等其数据也是应用自身的一部分,由此可以看出有状态应用本身会包含两部分:应用与数据。
一致性是分布式系统中很常见的问题,上面提到有状态应用包含数据部分,那数据和一致性是不是一个东西呢?答案是并不一定,在诸如zookeeper等应用中,会通过zab协议保证数据写入到集群中的大多数节点,而在诸如kafka之类的应用其一致性设计要求相对较低,由此可以看出有状态应用数据的一致性,更多的是由对应场景的系统设计而决定。
通常分布式系统中都至少要保证分区容忍性,以防止部分节点故障导致整个系统不可用,在k8s中的statefulset中的 Pod的管理策略则是保证尽可能安全的逐个Pod更新,而不是并行启动或停止所有的Pod。
- ##############所有命令##############
- 1.创建
- kubectl create -f test-zk-ss.yaml
-
- 2.删除
- kubectl delete -f test-zk-ss.yaml #删除模板
- kubectl delete statefulset test-zk-ss #删除名称
-
- 3.更新
- kubectl apply -f test-zk-ss-new.yaml #更新模板
- kubectl edit statefulset test-zk-ss #更新名称
-
- 4.查询
- kubectl get statefulset test-zk-ss -o yaml #查询模板
- kubectl describe statefulset test-zk-ss #查询名称
本篇云原生更行到第二部分----Kubernetes核心技术(中)
后面继续分享,敬请期待