乐趣区

关于java:五Docker案例Kubernetes十

redis

敞开防火墙

# 敞开防火墙
systemctl stop firewalld.service
# 禁止防火墙开机启动
systemctl disable firewalld.service

启动或重启 docker

# 启动 docker
systemctl start docker

# 重启 docker
systemctl restart docker

redis

# 启动三个 Redis 容器
docker run -d --name redis7000 -p 7000:6379 redis
docker run -d --name redis7001 -p 7001:6379 redis
docker run -d --name redis7002 -p 7002:6379 redis

# 查看容器
docker ps
# 拜访 Redis 服务
docker exec -it redis7000 redis-cli
docker exec -it redis7001 redis-cli
docker exec -it redis7002 redis-cli

实现代码

package test;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.JedisShardInfo;
import redis.clients.jedis.ShardedJedis;
import redis.clients.jedis.ShardedJedisPool;
import java.util.ArrayList;
public class Test {public static void main(String[] args) {
        // 配置对象
 JedisPoolConfig conf = new JedisPoolConfig();
        // 服务器列表
 ArrayList<JedisShardInfo> list = new ArrayList<JedisShardInfo>();
        list.add(new JedisShardInfo("192.168.64.150",7000));
        list.add(new JedisShardInfo("192.168.64.150",7001));
        list.add(new JedisShardInfo("192.168.64.150",7002));
        // 创立分片客户端
 ShardedJedisPool pool = new ShardedJedisPool(conf, list);
        ShardedJedis j = pool.getResource();
        // 存储数据 0 - 99 键值对
 for (int i=0;i<100;i++){j.set("k"+i,"v"+i);
        }
    }
}

web+mysql

网络

# 删除 my-net 网络
docker network rm my-net
# 创立 dockernet 网络
docker network create dockernet --subnet=172.18.0.0/24
# 查看网络
docker network ls
docker inspect dockernet
# 查看宿主机上创立的虚构网络
ifconfig

启动 mysql 容器

# 创立数据卷 mysql-data
docker volume create mysql-data
# 查看数据卷详情
docker inspect mysql-data

# 删除容器
docker rm -f mysql

# 启动 mysql
docker run \
-d --name mysql \
-p 3306:3306 \
-v mysql-data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=root \
--restart=always \
--net dockernet \
--ip 172.18.0.11 \
mariadb

# 导入数据 课前材料 \ 亿发课前材料 -2003\DevOps 课前材料 \docker\docker 课前材料 \EasyMall\easymall.sql

web 利用

# 筹备宿主机的文件夹和文件
mkdir /opt/webapps
# 上传 课前材料 \ 亿发课前材料 -2003\DevOps 课前材料 \docker\docker 课前材料 \EasyMall\ROOT.war 到 /opt/webapps/

# 启动 tomcat 容器
docker run -d --name web \
-p 80:8080 \
-v /opt/webapps:/usr/tomcat/webapps \
--net dockernet \
--ip 172.18.0.12 \
tomcat:7

http://192.168.64.150

Kubernetes

简称 K8s
全自动容器部署工具 – 继续部署

谷歌的开源工具,在谷歌外部曾经运行几年,治理上千万容器
毛病:过于简单

集群搭建的简化我的项目:

  • https://github.com/opsnull/fo…

手把手部署 kubernetes

  • https://github.com/easzlab/ku…

一键装置脚本

K8s 集群计划
1、单机 – 16G 以上
一个主控,两个工作节点
2、单机 – 8G 以上
一个主控 + 工作基点,一个工作节点
3、多台主机 – 4G
一台主机启动一个虚拟机,用桥接网络

配置集群环境

1、克隆 centos-7-1908:k1
2、设置 cpu 和内存
cpu – 2
内存 – 2G
第三个计划,把网络设置成桥接网络
3、设置 ip

./ip-static
ip:192.168.64.191
第三个计划,用主动获取 ip
./ip-dhcp

4、上传文件

  • easzup、images.gz 两个文件上传到
  • easzup 上传到 /root 目录下
  • ansible 目录上传到 /etc/ 目录下
# 对 easzup 文件设置执行权限
chmod +x ./easzup

# 下载离线安装文件, 并装置配置 docker,
# 如果离线文件曾经存在则不会反复下载,
# 离线安装文件寄存门路: /etc/ansible
./easzup -D

# 启动 kubeasz 工具应用的长期容器
./easzup -S

# 进入该容器
docker exec -it kubeasz sh

# 上面命令在容器内执行
# 配置离线装置
cd /etc/ansible
sed -i 's/^INSTALL_SOURCE.*$/INSTALL_SOURCE:"offline"/g' roles/chrony/defaults/main.yml
sed -i 's/^INSTALL_SOURCE.*$/INSTALL_SOURCE:"offline"/g' roles/ex-lb/defaults/main.yml
sed -i 's/^INSTALL_SOURCE.*$/INSTALL_SOURCE:"offline"/g' roles/kube-node/defaults/main.yml
sed -i 's/^INSTALL_SOURCE.*$/INSTALL_SOURCE:"offline"/g' roles/prepare/defaults/main.yml
exit

# 装置 python, 已装置则疏忽这一步
yum install python -y

为了节省时间, 前面课程中应用的 docker 镜像不必再花工夫从网络下载
将课前材料中 images.gz 中的镜像导入 docker

docker load -i images.gz

第三计划,下面 6 步在每台电脑都要做

7、以后服务器拍摄快照
8、克隆 k1,克隆两个服务器:k2、k3
9、k2 和 k3 设置 ip

  • 192.168.64.192
  • 192.168.64.193

./ip-static
192.168.64.193

在 master 上持续配置装置环境

# 装置 pip, 已装置则疏忽这一步
wget -O /etc/yum.repos.d/epel-7.repo https://mirrors.aliyun.com/repo/epel-7.repo
yum install git python-pip -y

# pip 装置 ansible(国内如果装置太慢能够间接用 pip 阿里云减速), 已装置则疏忽这一步
pip install pip --upgrade -i https://mirrors.aliyun.com/pypi/simple/
pip install ansible==2.6.12 netaddr==0.7.19 -i https://mirrors.aliyun.com/pypi/simple/

# 在 ansible 管制端配置免明码登陆其余节点服务器
ssh-keygen -t ed25519 -N '' -f ~/.ssh/id_ed25519

# 公钥复制到所有节点, 包含 master 本人
# 按提醒输出 yes 和 root 管理员的明码
ssh-copy-id 192.168.64.191

ssh-copy-id 192.168.64.192

ssh-copy-id 192.168.64.193

配置集群服务器的 ip

cd /etc/ansible && cp example/hosts.multi-node hosts && vim hosts

# 查看集群主机状态
ansible all -m ping

一键装置 k8s 集群

装置步骤十分多, 工夫较长, 急躁期待装置实现

cd /etc/ansible
ansible-playbook 90.setup.yml

设置 kubectl 命令别名

# 设置 kubectl 命令别名 k
echo "alias k='kubectl'" >> ~/.bashrc

# 使设置失效
source ~/.bashrc

配置主动补全

yum install -y bash-completion

source <(kubectl completion bash)

echo "source <(kubectl completion bash)" >> ~/.bashrc

source ~/.bashrc

验证装置

k get cs
---------------------------------------------------------
NAME                 STATUS    MESSAGE             ERROR
etcd-1               Healthy   {"health":"true"}   
scheduler            Healthy   ok                  
controller-manager   Healthy   ok                  
etcd-2               Healthy   {"health":"true"}   
etcd-0               Healthy   {"health":"true"}   

k get node
---------------------------------------------------------------------
NAME             STATUS                     ROLES    AGE     VERSION
192.168.64.191   Ready,SchedulingDisabled   master   5d23h   v1.15.2
192.168.64.192   Ready                      node     5d23h   v1.15.2
192.168.64.193   Ready                      node     5d23h   v1.15.2

K8s 基本概念

pod 容器

docker 容器的封装对象,一个 pod 能够封装多个 docker 容器
K8s 以 pod 为单位来部署容器

rc 控制器

能够自动控制容器的部署和销毁

cd ~/

k run \
    --image=luksa/kubia \
    --port=8080 \
    --generator=run/v1 kubia

k get rc
---------------------------------------
NAME    DESIRED   CURRENT   READY   AGE
kubia   1         1         1       24s

k get pods
----------------------------------------------
NAME          READY   STATUS    RESTARTS   AGE
kubia-9z6kt   1/1     Running   0          28s

service

提供一个不变的拜访地址,能够向所有容器转发调用

k expose \
    rc kubia \
    --type=NodePort \
    --name kubia-http

k get svc
------------------------------------------------------------------------------
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
kubia-http   NodePort    10.68.194.195   <none>        8080:20916/TCP   4s

pod 主动伸缩

k8s 对利用部署节点的主动伸缩能力十分强, 只须要指定须要运行多少个 pod,k8s 就能够实现 pod 的主动伸缩

# 将 pod 数量减少到 3 个
k scale rc kubia --replicas=3

k get po -o wide
----------------------------------------------------------------------------------------------------------------
NAME          READY   STATUS    RESTARTS   AGE   IP            NODE             NOMINATED NODE   READINESS GATES
kubia-q7bg5   1/1     Running   0          10s   172.20.3.29   192.168.64.193   <none>           <none>
kubia-qkcqh   1/1     Running   0          10s   172.20.2.30   192.168.64.192   <none>           <none>
kubia-zlmsn   1/1     Running   0          16m   172.20.3.28   192.168.64.193   <none>           <none>


# 将 pod 数量缩小到 1 个
k scale rc kubia --replicas=1

# k8s 会主动进行两个 pod, 最终 pod 列表中会只有一个 pod
k get po -o wide
---------------------------------------------------------------------------------------------------------------------
NAME          READY   STATUS        RESTARTS   AGE    IP            NODE             NOMINATED NODE   READINESS GATES
kubia-q7bg5   1/1     Terminating   0          6m1s   172.20.3.29   192.168.64.193   <none>           <none>
kubia-qkcqh   1/1     Terminating   0          6m1s   172.20.2.30   192.168.64.192   <none>           <none>
kubia-zlmsn   1/1     Running       0          22m    172.20.3.28   192.168.64.193   <none>           <none>

应用部署文件手动部署 pod

创立 kubia-manual.yml 部署文件

cat <<EOF > kubia-manual.yml 
apiVersion: v1               # k8s api 版本
kind: Pod                    # 该部署文件用来创立 pod 资源
metadata:                
  name: kubia-manual         # pod 名称前缀, 前面会追加随机字符串
spec:
  containers:                # 对 pod 中容器的配置
  - image: luksa/kubia       # 镜像名
    imagePullPolicy: Never
    name: kubia              # 容器名
    ports:
    - containerPort: 8080    # 容器裸露的端口
      protocol: TCP
EOF

应用部署文件创建 pod

k create -f kubia-manual.yml

k get po
-----------------------------------------------
NAME           READY   STATUS    RESTARTS   AGE
kubia-manual   1/1     Running   0          19s

查看 pod 的部署文件

# 查看 pod 的部署文件
k get po kubia-manual -o yaml

查看 pod 日志

k logs kubia-manual
退出移动版