五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 list = new ArrayList();
        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
全自动容器部署工具 - 持续部署

谷歌的开源工具,在谷歌内部已经运行几年,管理上千万容器
缺点:过于复杂

集群搭建的简化项目:

手把手部署kubernetes

一键安装脚本

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

image.png

# 检查集群主机状态
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           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              
kubia-qkcqh   1/1     Running   0          10s   172.20.2.30   192.168.64.192              
kubia-zlmsn   1/1     Running   0          16m   172.20.3.28   192.168.64.193              


# 将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              
kubia-qkcqh   1/1     Terminating   0          6m1s   172.20.2.30   192.168.64.192              
kubia-zlmsn   1/1     Running       0          22m    172.20.3.28   192.168.64.193              

使用部署文件手动部署pod

创建kubia-manual.yml部署文件

cat < 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

你可能感兴趣的:(java)