本篇文章分为3次分享完
四、持久化 Volume
1.数据卷 volume
2. 分为三类:
3.分别讲解
(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地址
(2)Docker Management Volume
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)
(3)Container Data (基于现有的容器)
1.运行容器
root@123 ~
docker run -d --name nginx1 nginx
2.容器共享
root@123 ~
docker run --volumes-from nginx1 -d nginxv
4.docker volume 命令
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
1.简介
Ingress 使用开源的反向代理负载均衡器来实现对外暴漏服务,比如 Nginx、Apache、Haproxy等。Nginx Ingress 一般有三个组件组成:
2.实现方案
3.分布介绍
(1)nginx:这是方式进行实现
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
1.简介
StatefulSet是k8s中有状态应用管理的标准实现,今天就一起来了解下其背后设计的场景与原理,从而了解其适用范围与场景。
2.特点
(1)有状态与无状态
通常可以分为两大类:有状态与无状态,比如web服务通常都是无状态的,web应用数据主要来自后端存储、缓存等中间件,而本身并不保存数; 而诸如redis、es等其数据也是应用自身的一部分,由此可以看出有状态应用本身会包含两部分:应用与数据。
(2)一致性与数据
一致性是分布式系统中很常见的问题,上面提到有状态应用包含数据部分,那数据和一致性是不是一个东西呢?答案是并不一定,在诸如zookeeper等应用中,会通过zab协议保证数据写入到集群中的大多数节点,而在诸如kafka之类的应用其一致性设计要求相对较低,由此可以看出有状态应用数据的一致性,更多的是由对应场景的系统设计而决定。
(3)单调有序
通常分布式系统中都至少要保证分区容忍性,以防止部分节点故障导致整个系统不可用,在k8s中的statefulset中的 Pod的管理策略则是保证尽可能安全的逐个Pod更新,而不是并行启动或停止所有的Pod。
3.部署命令
##############所有命令##############
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核心技术(中)
后面继续分享,敬请期待