Docker swarm
Swarm是Docker官方提供的一款集群管理工具,其主要作用是把若干台Docker主机抽象为一个整体,并且通过一个入口统一管理这些Docker主机上的各种Docker资源。Swarm和Kubernetes比较类似,但是更加轻,具有的功能也较kubernetes更少一些。
Swarm优点:
1).任何规模都有高性能表现
2)灵活的容器调度
3)服务的持续可用性
4)和 Docker API 及整合支持的兼容性
5)Docker Swarm 为 Docker 化应用的核心功能(诸如多主机网络和存储卷管理)提供原生支持
创建 Swarm 集群
环境:
foundation24 172.25.24.250 swarm manager
Server1 172.25.24.1 swarm agent
Server2 172.25.24.2 swarm agent
三台主机安装docker
Manage节点创建集群
docker swarm init --advertise-addr 172.25.24.250 #如果你的 Docker 有多个 IP,必须使用 --advertise-addr 指定 IP
docker swarm join-token worker #查看加入集群命令
Server1与server2加入集群
docker swarm join --token SWMTKN-1-0miktplc6qkpa51bi0bv2ni2z8vzby3sjfu8i0jwlg2os4o242-3jlkoxy0p09wthkor6g5i5xve 172.25.24.250:2377
在manage节点查看集群节点信息
docker node ls
在集群中部署nginx
因为虚拟机没有网,所以我们使用manage节点的私有仓库
manage节点创建私有仓库
docker run -d --name registry -p 5000:5000 -v /opt/registry:/var/lib/registry registry:2.3.1
创建并上传镜像
docker tag nginx:latest 172.25.24.250:5000/nginx
docker push 172.25.24.250:5000/nginx
在server1与server2节点指定私有仓库
vim /etc/docker/daemon.json
{
"insecure-registries": ["172.25.24.250:5000"]
}
systemctl restart docker.service
docker service create --name nginx --publish 80:80 --replicas 3 172.25.24.250:5000/nginx #部署服务
docker service ps nginx #查看各节点信息
给每个容器写一个发布页面
测试:
可以发现自带负载均衡
for i in {1..10}; do curl 172.25.24.250;done
添加图形监控页面
docker load -i visualizer.tar
docker service create --name=viz --publish=8080:8080/tcp --constraint=node.role==manager --mount=type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock dockersamples/visualizer
浏览器访问foundation24 的ip:8080
集群中容器可以拉神或缩减
拉伸
docker service scale nginx=6
可以发现新增的三个容器被分到了不同的节点
查看监控页面
给新加的三个容器写一个发布页面
测试:
可以发现新加的容器也实现了负载均衡
缩减
docker service scale nginx=3
查看监控页面:
高可用测试:
关闭server2上的docker
查看监控页面可以发现之前server2上的容器已被其他节点接管
再次启动server2,server2不会主动加入集群
再次拉伸集群
docker service scale nginx=9
查看监控页面可以发现server2与其他节点各接管三个容器
Swarm集群滚动更新
vim Dockerfile
FROM nginx as base
# https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
ARG Asia/Shanghai
RUN mkdir -p /opt/var/cache/nginx && \
cp -a --parents /usr/lib/nginx /opt && \
cp -a --parents /usr/share/nginx /opt && \
cp -a --parents /var/log/nginx /opt && \
cp -aL --parents /var/run /opt && \
cp -a --parents /etc/nginx /opt && \
cp -a --parents /etc/passwd /opt && \
cp -a --parents /etc/group /opt && \
cp -a --parents /usr/sbin/nginx /opt && \
cp -a --parents /lib/x86_64-linux-gnu/libpcre.so.* /opt && \
cp -a --parents /lib/x86_64-linux-gnu/libz.so.* /opt && \
cp -a --parents /lib/x86_64-linux-gnu/libc.so.* /opt && \
cp -a --parents /lib/x86_64-linux-gnu/libdl.so.* /opt && \
cp -a --parents /lib/x86_64-linux-gnu/libpthread.so.* /opt && \
cp -a --parents /lib/x86_64-linux-gnu/libcrypt.so.* /opt && \
cp -a --parents /usr/lib/x86_64-linux-gnu/libssl.so.* /opt && \
cp -a --parents /usr/lib/x86_64-linux-gnu/libcrypto.so.* /opt && \
cp /usr/share/zoneinfo/${TIME_ZONE:-ROC} /opt/etc/localtime
FROM gcr.io/distroless/base
COPY --from=base /opt /
EXPOSE 80
COPY index.html /usr/share/nginx/html
ENTRYPOINT ["nginx", "-g", "daemon off;"]
cat index.html
www.westos.org
docker build -t nginx:v1 .
在私有仓库中上传nginx:v1
docker tag nginx:v1 172.25.24.250:5000/nginx:v1
docker push 172.25.24.250:5000/nginx:v1
更新
docker service scale nginx=30 #拉伸集群以便观察效果
docker service update --image 172.25.24.250:5000/nginx:v1 --update-delay 3s --update-parallelism 3 nginx #更新,--update-delay 更新间隔时间 ,--update-parallelism 每次更新的容器数量
查看监控页面,红点的容器表示正在更新
Swarm集群服务删除及退出
docker service rm nginx
docker service rm viz
其他节点
docker swarm leave
Swarm leader节点
docker swarm leave --force
各个节点删除创建服务时新建的网络
kubernetes
环境:
Server1 172.25.24.1
Server2 172.25.24.2
Server3 172.25.24.3
各节点安装软件包
opsx.alibaba.com 阿里镜像站
注:将/etc/yum.conf中的keepcache修改为1,我们在安装软件包时会保留缓存,可在/var/cache/yum/x86_64/7Server中查看
systemctl enable kubelet && systemctl start kubelet
创建/etc/sysctl.d/k8s.conf
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
kubeadm config images list #查看各镜像版本
导入以下镜像
禁掉swap分区
swapoff -a
tail -n 1 /etc/fstab #注释掉swap自动挂载
vim /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
vm.swappiness = 0
集群初始化
kubeadm init --apiserver-advertise-address=172.25.24.1 --pod-network-cidr=10.244.0.0/16 #--apiserver-advertise-address指定ip ,--pod-network-cidr 此地址是固定的
vim /etc/sudoers
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
kubectl get cs
source <(kubectl completion bash) > .bashrc #添加环境变量,方便使用
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml #需要机器可以上网
查看节点信息
kubectl get nodes
Server2
systemctl enable kubelet.service
systemctl start kubelet.service
导入镜像
禁掉swap分区
swapoff -a
tail -n 1 /etc/fstab #注释掉swap自动挂载
vim /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
vm.swappiness = 0
sysctl --system
导入模块
modprobe ip_vs_sh
modprobe ip_vs_wrr
加入集群
kubeadm join 172.25.24.1:6443 --token zcshn2.q0uzqibfjdqbb85o --discovery-token-ca-cert-hash sha256:d0cd898f60d937bfbe63cd17380c56140a23e9461d6ec0d2078871bccd7cf4a4
若出现此报错,需要添加网关
在master节点查看
kubectl get nodes
Server3配置同server2