Kubernetes 完全教程 预备课

Docker 以及 Docker 网络

王渊命 @jolestar

bg


Agenda

  1. 容器是什么?
  2. 手动打造一个 Docker
  3. Kubernetes 中的 Pod 和容器的关系
  4. 后续 Kubernetes 课程介绍

容器是什么?

container


技术领域的容器(Container)

  • List/Heap/Queue/Set
  • J2ee Web Container
  • Linux Container(LXC,Docker)

容器的特性

  • 让不标准的物品标准化(杂物,水,应用)
  • 给上层工具提供标准化的操作方式,屏蔽细节
    • 包装,运输
    • add/remove/iterator(复用算法)
    • 应用管理和调度

容器(Linux Container)的历史

container-history


Docker (Moby) 如何实现应用标准化

问题 现状 Docker 的方案
安装包 war/jar,rpm/deb, src, bin Image/Image Layer
运行环境 jvm,php, ruby, python Image/Image Layer
进程启动方式 web container, cmd, script Image ENTRYPOINT/CMD
进程资源隔离限制 Namespace/CGroup
进程文件路径冲突 Chroot
端口冲突 修改配置 Network(IP per Container)
日志输出 文件 stderr/stdout
安装包的仓库 nexus, rpm rep,ftp Docker Registry

手动打造一个 Docker — Xocker


安装 Docker 以及一些工具

  1. apt-get update
  2. apt-get install -y ebtables socat apt-transport-https bash-completion ntp wget bridge-utils cgroup-tools tree
  3. apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
  4. apt-add-repository 'deb https://apt.dockerproject.org/repo ubuntu-xenial main'
  5. apt-get update
  6. apt-cache policy docker-engine
  7. apt-get install -y docker-engine

准备目录以及一个 Docker 镜像

  1. mkdir /var/lib/xocker/
  2. mkdir /var/lib/xocker/image
  3. docker pull busybox:glibc
  4. docker pull jolestar/go-probe
  5. docker pull jolestar/dockerbox
  6. docker images
  7. docker image save busybox:glibc -o busybox.tar
  8. mkdir busybox
  9. tar -xvf busybox.tar -C busybox/

解压 Image,分析构成,以及把其中的 Image Layer 解压,并移动到 /var/lib/xocker/image/busybox/


分层文件系统

先看看 chroot 的效果

  1. # 先备份一下
  2. cp -r /var/lib/xocker/image/busybox/ /var/lib/xocker/image/busybox.bak
  3. chroot /var/lib/xocker/image/busybox/ /bin/sh
  4. # 执行 rm -rf *, 然后退出看看效果
  5. # 恢复回来
  6. cp -r /var/lib/xocker/image/busybox.bak /var/lib/xocker/image/busybox

再看 aufs 的工作原理

  1. mkdir -p /var/lib/xocker/mnt/1
  2. mkdir -p /var/lib/xocker/mnt/1-data
  3. mkdir -p /var/lib/xocker/mnt/1-init
  4. mkdir -p /var/lib/xocker/mnt/1-init/etc/ && mkdir -p /var/lib/xocker/mnt/1-init/proc && echo "hello" > /var/lib/xocker/mnt/1-init/etc/myinit && tree /var/lib/xocker/mnt/1-init
  5. mount -t aufs -o dirs=/var/lib/xocker/mnt/1-data:/var/lib/xocker/mnt/1-init:/var/lib/xocker/image/busybox none /var/lib/xocker/mnt/1
  6. chroot /var/lib/xocker/mnt/1 /bin/sh
  7. touch /tmp/test.data
  8. rm /etc/myinit

容器网络

准备一个 bridge

  1. brctl addbr xocker0
  2. ip addr add 172.18.0.1/24 dev xocker0
  3. ip link set dev xocker0 up

准备 veth peer

  1. ip link add dev veth0_1 type veth peer name veth1_1
  2. ip link set dev veth0_1 up
  3. ip link set veth0_1 master xocker0
  4. ip netns add netns_test
  5. ip link set veth1_1 netns netns_test
  6. ip netns exec netns_test ip link set dev lo up
  7. ip netns exec netns_test ip link set veth1_1 address 02:42:ac:11:00:01
  8. ip netns exec netns_test ip addr add 172.18.0.2/24 dev veth1_1
  9. ip netns exec netns_test ip link set dev veth1_1 up
  10. ip netns exec netns_test ip route add default via 172.18.0.2

CGroup/Namespace Run

  1. cgcreate -g cpu,cpuacct,memory:/test
  2. cgexec -g "cpu,cpuacct,memory:/test" ip netns exec netns_test unshare -fmuip --mount-proc chroot "/var/lib/xocker/mnt/1" /bin/sh -c "/bin/mount -t proc proc /proc && /bin/sh"

Kubernetes 中的 Pod 和容器的关系

  1. docker run -d --net=none --name pause busybox:glibc sleep 999999
  2. # 创建 netns 文件夹连接
  3. container_id="pause"
  4. pid=$(docker inspect -f '{{.State.Pid}}' ${container_id})
  5. mkdir -p /var/run/netns/
  6. ln -sfT /proc/$pid/ns/net /var/run/netns/$container_id
  7. # 创建网络
  8. ip link add dev veth0_2 type veth peer name veth1_2
  9. ip link set dev veth0_2 up
  10. ip link set veth0_2 master xocker0
  11. ip link set veth1_2 netns ${container_id}
  12. ip netns exec ${container_id} ip link set veth1_2 address 02:42:ac:11:00:02
  13. ip netns exec ${container_id} ip addr add 172.18.0.3/24 dev veth1_2
  14. ip netns exec ${container_id} ip link set dev veth1_2 up
  15. ip netns exec ${container_id} ip route add default via 172.18.0.1
  16. # 进入容器看下网络
  17. docker exec ${container_id} ifconfig
  18. # 启动其他容器
  19. docker run -d --net=container:pause --name go-probe jolestar/go-probe
  20. docker run -it --net=container:pause --name cli jolestar/dockerbox bash
  21. # 通过 curl 调用本地服务
  22. curl http://localhost
  23. netstat -ntpl

iptables 和 Docker

  1. docker run -d -p 80:80 --name go-probe2 jolestar/go-probe
  2. curl http://localhost
  3. iptables -S -t nat
  4. -A DOCKER ! -i docker0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 172.17.0.2:80

Docker Volume 映射

  1. ls /data
  2. docker run -rm -it -v /data:/data --name cli2 jolestar/dockerbox bash
  3. # 在容器中执行
  4. touch test.data /data/
  5. # 退出查看
  6. ls /data

后续 Kubernetes 课程介绍

  1. Kubernetes 架构概述
  2. Kubernetes 的安装和运维
  3. Kubernetes 的网络和存储
  4. Kubernetes 的 API Spec 以及安全机制
  5. Kubernetes 的应用管理(案例)
  6. Kubernetes 的日志监控与故障排除
  7. Kubernetes 的扩展开发

FAQ

个人博客: http://jolestar.com

about


预备课:Docker 以及 Docker 网络 - 图6