Docker 与 kubernet总结


By jack.yan Docker 与 kubernet 总结 目录 Docker 与 kubernet 总结 .................................................................................................................. 1 1.环境: .............................................................................................................................................. 2 2.Docker 初识 ................................................................................................................................... 2 2.1 安装 .................................................................................................................................... 2 2.2 常用命令分类 ..................................................................................................................... 2 2.2.1 查看类: .................................................................................................................. 3 2.2.2Images 相关: .......................................................................................................... 3 2.2.3 容器管理: .............................................................................................................. 5 2.3 建立 docker 私有仓库 ........................................................................................................ 9 2.4 使用 Supervisor 来管理进程 ......................................................................................... 10 3 Kubernet ....................................................................................................................................... 11 3.1 逻辑图............................................................................................................................... 11 3.2 基本概念........................................................................................................................... 12 3.2.1. Pods ....................................................................................................................... 12 3.2.2. Replication Controllers .......................................................................................... 12 3.2.3、Services ............................................................................................................... 13 3.2.4、Labels .................................................................................................................. 13 3.2.5、Proxy .................................................................................................................... 13 3.3 安装 .................................................................................................................................. 13 3.3.1Master 安装 ............................................................................................................ 13 3.3.2 Minion 安装: ....................................................................................................... 15 3.4 启动服务: ....................................................................................................................... 18 3.4.1 Master 启动: ....................................................................................................... 18 3.4.2Minion: ................................................................................................................. 21 3.5 功能性测试: ................................................................................................................... 24 3.5.1 查看类.................................................................................................................... 24 3.5.2 测试 pod,replicationcontroller 和 service ............................................................ 25 3.6 功能性验证 ............................................................................................................... 28 3.6.1 跨主机容器连通性验证: .................................................................................... 28 3.6.2 访问容器 ................................................................................................................ 28 3.6.3 容器状态强一致性验证: .................................................................................... 30 3.7 未完待续: ....................................................................................................................... 32 By jack.yan 1.环境: 本次环境在 cloudstack 中虚拟机中完成 操作系统:Ubuntu14.04 服务器 IP: Role pub IP Guest IP soft Master 172.20.0.93 10.1.1.21 kube-apiserver,kube-controller-manager,kube-scheduler,etcd Minion1 172.20.0.94 10.1.1.30 kube-proxy,kubelet,flannel,docker Minion2 172.20.0.95 10.1.1.247 kube-proxy,kubelet,flannel,docker Registry 172.20.0.183 10.1.1.106 docker 2.Docker 初识 2.1 安装  方式一:通过系统自带安装(docker 版本比较低): #apt-get install -y docker.io  方式二:使用官方推荐的脚本安装: #curl -s https://get.docker.io/ubuntu/ | sudo sh Tips:docker 存在内核版本和文件系统的要求: ubuntu 下使用的 docker,需要 aufs 文件系统支持,所以安装之前需要检查 aufs 是否安装 #apt-get install linux-image-extra-`uname -r` 2.2 常用命令分类 By jack.yan 2.2.1 查看类:  查看版本信息 # docker version Client version: 1.5.0 Client API version: 1.17 Go version (client): go1.4.1 Git commit (client): a8a31ef OS/Arch (client): linux/amd64 Server version: 1.5.0 Server API version: 1.17 Go version (server): go1.4.1 Git commit (server): a8a31ef 或者 root@elk-95:~# docker info Containers: 0 Images: 28 Storage Driver: aufs Root Dir: /var/lib/docker/aufs Backing Filesystem: Dirs: 28 Execution Driver: native-0.2 Kernel Version: 3.13.0-32-generic Operating System: Ubuntu 14.04.1 LTS CPUs: 2 Total Memory: 1.955 GiB Name: master-93 ID: HNVN:MT6Q:M6EU:GBXD:RJGE:UQE3:FO4U:JXUP:B2UU:JTM6:TJEX:RF72 WARNING: No swap limit support 可以看到本机的 docker 使用的文件系统驱动为 aufs,根目录在/var/lib/docker/aufs 2.2.2Images 相关:  查看本地的 docker 镜像 # docker images By jack.yan 或者 root@elk-95:/home/ops# docker images --tree 在列出信息中,可以看到几个字段信息 来自哪个仓库, 镜像的标记(tag), 镜像的 ID 号(唯一) 创建时间 镜像大小 Tips:该命令实际是读取 docker 下的一个文件: # cat /var/lib/docker/repositories-aufs |python -mjson.tool { "Repositories": { "ansible/ubuntu14.04-ansible": { "latest": "8ac7fbcb5b4019a3dfabbc5dac4802095866bb427c0b45096b13a6554b427a56" }, "ubuntu": { "14.04": "d0955f21bf24f5bfffd32d2d0bb669d0564701c271bc3dfc64cfc5adfdec2d07", "14.04.2": "d0955f21bf24f5bfffd32d2d0bb669d0564701c271bc3dfc64cfc5adfdec2d07", "latest": "d0955f21bf24f5bfffd32d2d0bb669d0564701c271bc3dfc64cfc5adfdec2d07", "trusty": "d0955f21bf24f5bfffd32d2d0bb669d0564701c271bc3dfc64cfc5adfdec2d07", "trusty-20150320": "d0955f21bf24f5bfffd32d2d0bb669d0564701c271bc3dfc64cfc5adfdec2d07" } } }  搜索 images 在官方 images 中搜索 images: #docker search oracle NAME DESCRIPTION STARS OFFICIAL AUTOMATED wnameless/oracle-xe-11g Oracle Express 11g R2 on Ubuntu 14.04.1 LTS 63 [OK] alexeiled/docker-oracle-xe-11g This is a spin off from wnameless/docker-o... 57 [OK] By jack.yan oraclelinux Oracle Linux is an open-source operating s... 27 [OK] ingensi/oracle-jdk Official Oracle JDK installed on centos. 8 [OK] oracle/oraclelinux Oracle Linux is an open-source operating s... 8 [OK] errordeveloper/oracle-jdk A minimalistic Oracle JDK 8 container on t... 7 [OK] errordeveloper/oracle-jre A minimalistic Oracle JRE 8 container on t... 4 [OK]  上传与下载: 命令:docker push/pull REPOSITORY:tag Tips:如不指定地址默认从官方 registry.hub.docker.com 下载,且默认下载 tag 为 latest  镜像导入导出: #docker export CONTAINER > export.tar eg: docker export 4795d3ae78c5 > export-ssh.tar #docker import URL|- [REPOSITORY[:TAG]] eg: cat export-ssh.tar | docker import - user/imagerepo:tag #docker save [OPTIONS] IMAGE [IMAGE...] docker save ubuntu > ubuntu-all.tar #docker load [-i|--input[=INPUT]] eg: docker load --input ubuntu-latest.tar tips: 导出后再导入(exported-imported)的镜像会丢失所有的历史并无法回滚到之前的层 (layer) 保存后再加载(saved-loaded)的镜像没有丢失历史和层(layer)。其持久化整个镜像,就 可以做到层回滚 2.2.3 容器管理: docker run Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...] 1. 守护进程模式: root@elk-95:/home/ops# docker run -d --name yxm ubuntu:14.04 /bin/bash 6b94dd9ce4e9c8401d85cfdea08c96376fa929dada4e8a4d4c1b611699061fb8 2. 提交对容器的更改: #docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] eg: docker commit -a="jack.yan" -m="just a test" 0ce2e9a45e9d jack/ubuntu:ssh By jack.yan 3. 连接容器的方式: 进入正在运行 container 有以下的三种方式: CID=$(docker ps -l -q) 1. docker attach $CID 2. docker exec -t -i $CID /bin/bash 3. 装 容器内安装 ssh server. Tips:建议使用第二或者第三种方式,第一种方式连接容器退出时很容易造成容器关闭 4. Dockerfile: Dockerfile 由一行行命令语句组成,并且支持以 # 开头的注释行。 一般的,Dockerfile 分为四部分:基础镜像信息、维护者信息、镜像操作挃令和容器启动时 执行的命令:以下为一个简单的 dockerfile 文件: # ssh FROM ubuntu:14.04 MAINTAINER jack.yan RUN apt-get update && apt-get install -y openssh-server RUN mkdir /var/run/sshd RUN echo 'root:screencast' | chpasswd RUN sed -i 's/PermitRootLogin without-password/PermitRootLogin yes/' /etc/ssh/sshd_config # SSH login fix. Otherwise user is kicked off after login RUN sed -i 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g'/etc/pam.d/sshd ENV NOTVISIBLE "in users profile" RUN echo "export VISIBLE=now" >> /etc/profile EXPOSE 22 CMD ["/usr/sbin/sshd", "-D"] 指令的一般格式为 INSTRUCTION arguments ,挃令包括 FROM 、 MAINTAINER 、 RUN 等。 FROM 格式为 FROM 或 FROM : 。 第一条指令必须为 FROM,如果在同一个 Dockerfile 中创建多个镜像时,可以使用多个 FROM MAINTAINER 格式为 MAINTAINER ,指定维护者信息。 RUN By jack.yan 格式为 RUN 或 RUN ["executable", "param1", "param2"] 。 前者将在 shell 终端中运行命令,即 /bin/sh -c ;后者则使用 exec 执行。指定使用其它终 端可以通过第二种方式实现,例如 RUN ["/bin/bash", "-c", "echo hello"] 。 每条 RUN 指令将在当前镜像基础上执行挃定命令,并提交为新的镜像。当命令较长时可以 使用 \ 来换行。 CMD 支持三种格式 CMD ["executable","param1","param2"] 使用 exec 执行,推荐方式; CMD command param1 param2 在 /bin/sh 中执行,提供给需要交互的应用; CMD ["param1","param2"] 提供给 ENTRYPOINT 的默认参数; 指定启动容器时执行的命令,每个 Dockerfile 只能有一条 CMD 命令。如果指定了多条命 令,只有最后一条会被执行。 如果用户启动容器时候指定了运行的命令,则会覆盖掉 CMD 指定的命令。 EXPOSE 格式为 EXPOSE [...] 。 告诉 Docker 服务端容器暴露的端口号,供互联系统使用。在启动容器时需要通过 -P,Docker 主机会自动分配一个端口转发到指定的端口。 ENV 格式 ENV 指定一个环境变量,会被后续 RUN 指令使用,并在容器运行时保持。 例如 ENV PG_MAJOR 9.3 ENV PG_VERSION 9.3.4 RUN curl -SL http://example.com/postgres-$PG_VERSION.tar.xz | tar -xJC /usr/src/postgress && … ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH ADD 格式为 ADD 。 诠命令将复制指定的 到容器中的 。 其中 可以是 Dockerfile 所在目录 的一个相对路径;也可以是一个 URL;也可以是一个 tar 文件(自动解压为目录) COPY 格式为 COPY 。 复制本地主机的 (为 Dockerfile 所在目录的相对路径)到容器中的 。 当使用本地目录为源目录时,推荐使用 COPY 。 ENTRYPOINT 两种格式: ENTRYPOINT ["executable", "param1", "param2"] ENTRYPOINT command param1 param2 (shell 中执行)。 By jack.yan 配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖。 每个 Dockerfile 中只能有一个 ENTRYPOINT ,当指定多个时,叧有最后一个起效。 VOLUME 格式为 VOLUME ["/data"] 。 创建一个可以从本地主机戒其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据 等。 USER 格式为 USER daemon 。 指定运行容器时的用户名戒 UID,后续的 RUN 也会使用指定用户。 当服务不需要管理员权限时,可以通过改命令指定运行用户。并且可以在之前创建所需要的 用户,例 如: RUN groupadd -r postgres && useradd -r -g postgres postgres 。要临时获取管理员权限可 以使用 gosu ,而不推荐 sudo 。 WORKDIR 格式为 WORKDIR /path/to/workdir 。 为后续的 RUN 、 CMD 、 ENTRYPOINT 指令配置工作目录。 可以使用多个 WORKDIR 指令,后续命令如果参数是相对路径,则会基于之前命令指定的路 径。例如 WORKDIR /a WORKDIR b WORKDIR c RUN pwd 则最终路径为 /a/b/c 。 ONBUILD 格式为 ONBUILD [INSTRUCTION] 。 配置当所创建的镜像作为其它新创建镜像的基础镜像时,所执行的操作指令。 例如,Dockerfile 使用如下的内容创建了镜像 image-A 。 [...] ONBUILD ADD . /app/src ONBUILD RUN /usr/local/bin/python-build --dir /app/src [...] 如果基于 image-A 创建新的镜像时,新的 Dockerfile 中使用 FROM image-A 指定基础镜像时, 会自动执行 ONBUILD 指令内容,等价于在后面添加了两条指令。 FROM image-A #Automatically run the following ADD . /app/src RUN /usr/local/bin/python-build --dir /app/src 使用 ONBUILD 只令的镜像,推荐在标签中注明,例如 ruby:1.9-onbuild 。 By jack.yan 创建镜像 编写完成 Dockerfile 只后,可以通过 docker build 命令来创建镜像。 基本的格式为 docker build [选项] 路径 ,诠命令将读取指定路径下(包括子目录)的 Dockerfile,并将改路径下所有内容发送给 Docker 服务端,由服务端来创建镜像。因此一般 建议放置 Dockerfile 的目录为空目录。也可以通过 .dockerignore 文件(每一行添加一条匹 配模式)来让 Docker 忽略路径下的目录和文件。 要指定镜像的标签信息,可以通过 -t 选项,例如 $ sudo docker build -t myrepo/myapp /tmp/test1/ 2.3 建立 docker 私有仓库  查看所有的 registry #docker search registry  pull 官方的 registry # docker pull registry  启动一个 registry 容器 #docker run -d -p 5000:5000 -v /registry:/tmp/registry registry tips:将本地目录/ registry 挂载到容器内的/tmp/registry(需要新建本地目录)  给需要上传的 image 打上 tag 用法:docker tag $ID $IP:$port/$name #docker tag tutum/nginx:registry 172.20.0.183:5000/nginx:registry  修改/etc/default/docker 添加如下(解决 https 的问题),并重启 docker 服务: DOCKER_OPTS="$DOCKER_OPTS --insecure-registry=172.20.0.183:5000"  上传: #docker push 172.20.0.183:5000/nginx:registry  私有仓库查询: root@master:/kubernet-config# curl http://172.20.0.183:5000/v1/search {"num_results": 1, "query": "", "results": [{"description": "", "name": "library/nginx"}]}  下载私有仓库镜像: 同样需要在 docker 的默认配置中加上以下配置: DOCKER_OPTS="$DOCKER_OPTS --insecure-registry=172.20.0.183:5000" # docker pull 172.20.0.183:5000/nginx:registry Pulling repository 172.20.0.183:5000/nginx 300f567fdf13: Download complete 300f567fdf13: Pulling image (registry) from 172.20.0.183:5000/nginx b3553b91f79f: Download complete ---------------------------- b7852942b911: Download complete Status: Downloaded newer image for 172.20.0.183:5000/nginx:registry By jack.yan  私有仓库中 image 增量更新验证: Push: # docker push 172.20.0.183:5000/nginx:registry_update The push refers to a repository [172.20.0.183:5000/nginx] (len: 1) Sending image list Pushing repository 172.20.0.183:5000/nginx (1 tags) Image b3553b91f79f already pushed, skipping Image ca63a3899a99 already pushed, skipping ------------- Image 7428bd008763 already pushed, skipping b7a6e92485c7: Image successfully pushed Pushing tag for rev [b7a6e92485c7] on {http://172.20.0.183:5000/v1/repositories/nginx/tags/registry_update} 2.4 使用 Supervisor 来管理进程 Docker 容器在启动的时候开启单个进程,比如,一个 ssh 戒者 apache 的 daemon 服务。 但我们经常需要在一个机器上开启多个服务,这可以有很多方法,最简单的就是把多个启动 命令方到一个启动脚本里面,启动的时候直接启动这个脚本,另外就是安装进程管理工具。 这里将使用进程管理工具 supervisor 来管理容器中的多个进程。使用 Supervisor 可以更好 的控制、管理、重启我们希望运行的进程。在这里演示一下如何同时使用 ssh 和 apache 服 务。 配置 首先创建一个 Dockerfile,内容和各部分的解释如下。 FROM ubuntu:13.04 MAINTAINER examples@docker.com RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list RUN apt-get update RUN apt-get upgrade –y 安装 supervisor 安装 ssh、apache 和 supervisor。 RUN apt-get install -y openssh-server apache2 supervisor RUN mkdir -p /var/run/sshd RUN mkdir -p /var/log/supervisor 返里安装 3 个软件,还创建了 2 个 ssh 和 supervisor 服务正常运行所需要的目录。 By jack.yan COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf 添加 supervisord 的配置文件,并复制配置文件到对应目录下面。 EXPOSE 22 80 CMD ["/usr/bin/supervisord"] 返里我们映射了 22 和 80 端口,使用 supervisord 的可执行路径启动服务。 supervisor 配置文件内容 [supervisord] nodaemon=true [program:sshd] command=/usr/sbin/sshd -D [program:apache2] command=/bin/bash -c "source /etc/apache2/envvars && exec /usr/sbin/apache2 -DFOREGROUND" 配置文件包吨目录和进程,第一段 supervsord 配置软件本身,使用 nodaemon 参数来运行。 第二段包含要控制的 2 个服务。每一段包含一个服务的目录和吪劢返个服务的命令 使用方法 创建镜像。 #docker build -t test/supervisord . 启动 supervisor 容器。 docker run -p 22 -p 80 -t -i test/supervisords 2015-04-14 18:53:22,312 CRIT Supervisor running as root (no user in config file) 2015-04-14 18:53:22,312 WARN Included extra file "/etc/supervisor/conf.d/supervisord.conf" during parsing 2015-04-14 18:53:22,342 INFO supervisord started with pid 1 2015-04-14 18:53:23,346 INFO spawned: 'sshd' with pid 6 2015-04-14 18:53:23,349 INFO spawned: 'apache2' with pid 7 3 Kubernet 3.1 逻辑图 By jack.yan 3.2 基本概念 3.2.1. Pods 在 Kubernetes 系统中,调度的最小颗粒不是单纯的容器,而是抽象成一个 Pod,Pod 是一个可以被创建、 销毁、调度、管理的最小的部署单元。比如一个或一组容器。 3.2.2. Replication Controllers Replication Controller 是 Kubernetes 系统中最有用的功能,实现复制多个 Pod 副本,往往一个应用需 要多个 Pod 来支撑,并且可以保证其复制的副本数,即使副本所调度分配的主宿机出现异常,通过 By jack.yan Replication Controller 可以保证在其它主宿机启用同等数量的 Pod。Replication Controller 可以通过 repcon 模板来创建多个 Pod 副本,同样也可以直接复制已存在 Pod,需要通过 Label selector 来关联。 3.2.3、Services Services 是 Kubernetes 最外围的单元,通过虚拟一个访问 IP 及服务端口,可以访问我们定义好的 Pod 资 源,目前的版本是通过 iptables 的 nat 转发来实现,转发的目标端口为 Kube_proxy 生成的随机端口,目 前只提供 GOOGLE 云上的访问调度,如 GCE。 3.2.4、Labels Labels 是用于区分 Pod、Service、Replication Controller 的 key/value 键值对,仅使用在 Pod、Service、 Replication Controller 之间的关系识别,但对这些单元本身进行操作时得使用 name 标签。 3.2.5、Proxy Proxy 不但解决了同一主宿机相同服务端口冲突的问题,还提供了 Service 转发服务端口对外提供服务的 能力,Proxy 后端使用了随机、轮循负载均衡算法。 目前 Kubernetes 迭代速度极快,每周都会有更新,同时也带来了不同版本操作方法的差异,另外官网文档 更新速度相对滞后及欠缺,带来一定挑战。在上游接入层官方侧重点还放在 GCE(Google Compute Engine) 的对接优化,针对个人私有云还未推出一套可行的接入解决方案。在 v0.5 版本中才引用 service 代理转发 的机制,且是通过 iptables 来实现,在高并发下性能令人担忧。但作者依然看好 Kubernetes 未来的发展, 至少目前还未看到另外一个成体系、具备良好生态圈的平台。 3.3 安装 3.3.1Master 安装 可以使用 github 提供的脚本安装,也可以下载 kubernet 的 tar 包来安装,然后修改安装 脚本,这里使用后者,github 的安装脚本在 tar 包中也有 By jack.yan 1. 解包: #tar -zxvf kubernetes.tar.gz # cd /root/kubernetes/cluster/ubuntu-cluster #cp ../../server/kubernetes-server-linux-amd64.tar.gz . 2. 修改 build.sh 部分如下: # flannel #echo "Download & build flanneld ..." #apt-get install linux-libc-dev #if [ ! -d flannel ] ; then # echo "flannel does not exsit, cloning ..." # git clone https://github.com/coreos/flannel.git #fi #pushd flannel #docker run -v `pwd`:/opt/flannel -i -t google/golang /bin/bash -c "cd /opt/flannel && ./build" #popd #cp flannel/bin/flanneld binaries/ #K8S_V="v0.12.0" #if [ ! -f kubernetes.tar.gz ] ; then # curl -L https://github.com/GoogleCloudPlatform/kubernetes/releases/download/$K8S_V/kubernetes.tar. gz -o kubernetes.tar.gz # tar xzf kubernetes.tar.gz #fi #pushd kubernetes/server tar xzf kubernetes-server-linux-amd64.tar.gz #popd cp kubernetes/server/bin/* binaries/ tips: master 无须 flannle,所以注释掉 无须再次下载 kubernet,只需解压即可,所以注释掉 3. 开始 build: # ./build.sh Download etcd release ... Download kubernetes release ... By jack.yan Done! All your commands locate in ./binaries dir 4. 可执行文件处理 复制执行文件到一个目录,并将该目录加入到环境变量中: #mkdir /opt/bin #cp binaries/* /opt/bin/ #echo 'export PATH=/opt/bin:$PATH' >>/etc/profile #source /etc/profile 5. 生成配置文件: # ./configure.sh Welcome to use this script to configure k8s setup Please enter all your cluster node ips, MASTER node comes first And separated with blank space like " ": 172.20.0.93 172.20.0.94 172.20.0.95 This machine acts as both MASTER and MINION: 1 only MASTER: 2 only MINION: 3 Please choose a role > 2 IP address of this machine > 172.20.0.93 Configure Success 3.3.2 Minion 安装: 1. 解包 tar -zxf kubernetes.tar.gz cd kubernetes/cluster/ubuntu-cluster/ cp ../../server/kubernetes-server-linux-amd64.tar.gz . 2. 修改 build.sh 脚本如下; #K8S_V="v0.12.0" #if [ ! -f kubernetes.tar.gz ] ; then # curl -L By jack.yan https://github.com/GoogleCloudPlatform/kubernetes/releases/download/$K8S_V/kubernetes.ta r.gz -o kubernetes.tar.gz # tar xzf kubernetes.tar.gz #fi #pushd kubernetes/server tar xzf kubernetes-server-linux-amd64.tar.gz popd cp kubernetes/server/bin/* binaries/ tips:无须再次下载 kubernet,只需解压即可,所以注释掉 3. 开始 build: # ./build.sh Download & build flanneld ... Reading package lists... Done Building dependency tree Reading state information... Done The following packages will be upgraded: linux-libc-dev 1 upgraded, 0 newly installed, 0 to remove and 140 not upgraded. Need to get 779 kB of archives. After this operation, 16.4 kB of additional disk space will be used. Get:1 http://mirrors.aliyun.com/ubuntu/ trusty-proposed/main linux-libc-dev amd64 3.13.0-49.81 [779 kB] Fetched 779 kB in 0s (1,803 kB/s) (Reading database ... 59851 files and directories currently installed.) Preparing to unpack .../linux-libc-dev_3.13.0-49.81_amd64.deb ... Unpacking linux-libc-dev:amd64 (3.13.0-49.81) over (3.13.0-41.70) ... Setting up linux-libc-dev:amd64 (3.13.0-49.81) ... flannel does not exsit, cloning ... Cloning into 'flannel'... remote: Counting objects: 823, done. remote: Compressing objects: 100% (4/4), done. remote: Total 823 (delta 1), reused 0 (delta 0), pack-reused 819 Receiving objects: 100% (823/823), 2.45 MiB | 217.00 KiB/s, done. Resolving deltas: 100% (382/382), done. Checking connectivity... done. ~/kubernetes/cluster/ubuntu-cluster/flannel ~/kubernetes/cluster/ubuntu-cluster Unable to find image 'google/golang:latest' locally Pulling repository google/golang 3cc1d7ae0e9c: Download complete 511136ea3c5a: Download complete 541923dd11eb: Download complete By jack.yan 11971b6377ef: Download complete 1f05e775f042: Download complete f53255d59b8b: Download complete be7f1feb5fc0: Download complete f2932f4b78d9: Download complete 1baeb754d8c9: Download complete Status: Downloaded newer image for google/golang:latest Building flanneld... ~/kubernetes/cluster/ubuntu-cluster Download etcd release ... % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 413 0 413 0 0 100 0 --:--:-- 0:00:04 --:--:-- 100 100 5607k 100 5607k 0 0 236k 0 0:00:23 0:00:23 --:--:-- 881k Download kubernetes release ... Done! All your commands locate in ./binaries dir 4. 可执行文件处理 复制执行文件到一个目录,并将该目录加入到环境变量中: #mkdir /opt/bin #cp binaries/* /opt/bin/ #echo 'export PATH=/opt/bin:$PATH' >>/etc/profile #source /etc/profile 5. 生成配置文件 6. # ./configure.sh Welcome to use this script to configure k8s setup Please enter all your cluster node ips, MASTER node comes first And separated with blank space like " ": 172.20.0.93 172.20.0.94 172.20.0.95 This machine acts as both MASTER and MINION: 1 only MASTER: 2 only MINION: 3 Please choose a role > 3 IP address of this machine > 172.20.0.94 Configure Success root@minion-94:~/kubernetes/cluster/ubuntu-cluster# By jack.yan 3.4 启动服务: 3.4.1 Master 启动: 根据官方给的这个脚本启动部分服务会出现启动不起来,这里做了几个修改,后续会将 etcd 作为集群,目前 etcd 采用单点 修改默认配置文件如下/etc/default/etcd 如下: ETCD_OPTS="-listen-client-urls=http://0.0.0.0:4001 -listen-peer-urls=http://0.0.0.0:7001" 各配置文件如下: /etc/default/etcd 如下: /etc/default/kube-apiserver 如下: Tpis:portal_net 定义的地址在 kubenet 定义的 service 服务会用到 ETCD_OPTS="-listen-client-urls=http://0.0.0.0:4001 -listen-peer-urls=http://0.0.0.0:7001" # Kube-Apiserver Upstart and SysVinit configuration file # Customize kube-apiserver binary location # KUBE_APISERVER="/opt/bin/kube-apiserver" # Use KUBE_APISERVER_OPTS to modify the start/restart options KUBE_APISERVER_OPTS="--address=0.0.0.0 \ --port=8080 \ --etcd_servers=http://127.0.0.1:4001 \ --logtostderr=true \ --portal_net=10.1.100.0/24" # Add more envionrment settings used by kube-apiserver here By jack.yan /etc/default/kube-controller-manager 如下 /etc/default/kube-scheduler 如下: # Kube-Controller-Manager Upstart and SysVinit configuration file # Customize kube-controller-manager binary location # KUBE_CONTROLLER_MANAGER="/opt/bin/kube-controller-manager" # Use KUBE_CONTROLLER_MANAGER_OPTS to modify the start/restart options KUBE_CONTROLLER_MANAGER_OPTS="--master=127.0.0.1:8080 \ --machines=172.20.0.94,172.20.0.95 \ --logtostderr=true" # Add more envionrment settings used by kube-controller-manager here # Kube-Scheduler Upstart and SysVinit configuration file # Customize kube-apiserver binary location # KUBE_SCHEDULER="/opt/bin/kube-scheduler" # Use KUBE_SCHEDULER_OPTS to modify the start/restart options KUBE_SCHEDULER_OPTS="--logtostderr=true \ --master=127.0.0.1:8080" # Add more envionrment settings used by kube-scheduler here By jack.yan 启动服务: #service etcd start #service kube-apiserver start #service kube-scheduler start #service kube-controlle start 通过 etcd 定义 docker 容器中使用的 ip 地址 #etcdctl mk /coreos.com/network/config '{"Network":"192.168.0.0/16"}' 通过 ie 访问 etcd: http://ip:port/v1/keys By jack.yan 命令行访问 etcd: # etcdctl ls --recursive / /registry /registry/controllers /registry/controllers/default /registry/controllers/default/webcontroller /registry/pods /registry/pods/default /registry/pods/default/webcontroller-pjzb3 /registry/pods/default/webcontroller-fplln /registry/pods/default/webcontroller-gziey /registry/pods/default/webcontroller-oh43e /registry/namespaces /registry/namespaces/default /registry/services /registry/services/specs /registry/services/specs/default /registry/services/specs/default/kubernetes /registry/services/specs/default/webservice /registry/services/specs/default/kubernetes-ro /registry/services/endpoints /registry/services/endpoints/default /registry/services/endpoints/default/kubernetes /registry/services/endpoints/default/kubernetes-ro /registry/services/endpoints/default/webservice /registry/minions /registry/minions/172.20.0.94 /registry/minions/172.20.0.95 /registry/events /registry/events/default /coreos.com /coreos.com/network /coreos.com/network/subnets /coreos.com/network/subnets/192.168.96.0-24 /coreos.com/network/subnets/192.168.63.0-24 /coreos.com/network/config 具体用法可以见官网 3.4.2Minion: 各配置文件如下: By jack.yan /etc/default/flannel 如下: /etc/default/kubelet 如下: /etc/default/kube-proxy 如下: # flannel Upstart and SysVinit configuration file # Customize kube-apiserver binary location # FLANNEL="/opt/bin/flanneld" # Use FLANNEL_OPTS to modify the start/restart options FLANNEL_OPTS="-etcd-endpoints=http://172.20.0.93:4001" # Kubelet Upstart and SysVinit configuration file # Customize kubelet binary location # KUBELET="/opt/bin/kubelet" # Use KUBELET_OPTS to modify the start/restart options KUBELET_OPTS="--address=0.0.0.0 \ --port=10250 \ --hostname_override=172.20.0.94 \ --api_servers=http://172.20.0.93:8080 \ --logtostderr=true" # Add more envionrment settings used by kube-scheduler here # Kube-Proxy Upstart and SysVinit configuration file # Customize kube-proxy binary location # KUBE_PROXY="/opt/bin/kube-proxy" # Use KUBE_PROXY_OPTS to modify the start/restart options KUBE_PROXY_OPTS="--master=http://172.20.0.93:8080 \ --logtostderr=true" # Add more envionrment settings used by kube-apiserver her By jack.yan Tips: 主要修改 kubelet 和 kube-proxy 指向 apiserver 的 ip 和 port, flanneld 调用的 etcd 指向的 ip 和 port 启动服务 #service kubelet start #service kube-proxy start #service flannel start 然后让 docker 启动的网络设置走到 flanneld,可以执行脚本: # /root/kubernetes/cluster/ubuntu-cluster/reconfigureDocker.sh 脚本内容如下: 可以看到网卡配置: root@minion-94:~/kubernetes/cluster/ubuntu-cluster# ifconfig docker0 Link encap:Ethernet HWaddr 56:84:7a:fe:97:99 inet addr:192.168.96.1 Bcast:0.0.0.0 Mask:255.255.255.0 UP BROADCAST MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) eth0 Link encap:Ethernet HWaddr 02:00:2f:10:00:4a inet addr:10.1.1.30 Bcast:10.1.1.255 Mask:255.255.255.0 inet6 addr: fe80::2fff:fe10:4a/64 Scope:Link if [ "$(id -u)" != "0" ]; then echo >&2 "Please run as root" exit 1 fi ip link set dev docker0 down brctl delbr docker0 source /run/flannel/subnet.env echo DOCKER_OPTS=\"-H tcp://127.0.0.1:4243 -H unix:///var/run/docker.sock \ --bip=${FLANNEL_SUBNET} --mtu=${FLANNEL_MTU}\" > /etc/default/docker service docker restart By jack.yan UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:214856 errors:0 dropped:0 overruns:0 frame:0 TX packets:111071 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:294141027 (294.1 MB) TX bytes:8823537 (8.8 MB) flannel0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 inet addr:192.168.96.0 P-t-P:192.168.96.0 Mask:255.255.0.0 UP POINTOPOINT RUNNING MTU:1472 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:500 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:2000 errors:0 dropped:0 overruns:0 frame:0 TX packets:2000 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:101056 (101.0 KB) TX bytes:101056 (101.0 KB) 至此 kubenet 基础环境安装完成 3.5 功能性测试: 3.5.1 查看类 查看 minion,pod,service,event,replicationController 信息 以下操作在 master 上实现 # kubectl get minions NAME LABELS STATUS 172.20.0.94 Ready 172.20.0.95 Ready ……. By jack.yan 3.5.2 测试 pod,replicationcontroller 和 service 这里以启动 nginx 的 web 服务为例,将容器的日志目录输出到宿主机的/wwwlog 目录下 (需要创建),且保持始终运行 2 个容器(后续可以动态调整) (一) 创建 ReplicationController 文件 nginx-rc.yaml Tips:也支持 json 格式,不过 yaml 看起来舒服点,以下操作在 master 上实现 id: webcontroller kind: ReplicationController apiVersion: v1beta1 desiredState: replicas: 2 replicaSelector: name: webserver_pod podTemplate: desiredState: manifest: version: v1beta1 id: webserver containers: - name: webserver image: tutum/nginx cpu: 1 ports: - containerPort: 80 volumeMounts: - name: access-log mountPath: "/var/log/nginx" volumes: - name: access-log source: hostDir: path: "/wwwlog" labels: name: webserver_pod (二) 创建 service 文件 nginx-service.yaml: Tips:以下操作在 master 上实现 By jack.yan id: webservice kind: Service apiVersion: v1beta1 port: 40080 containerPort: 80 publicIPS: - "172.20.0.94" - "10.1.1.30" - "172.20.0.95" - "10.1.1.247" selector: name: webserver_pod labels: name: webserver_pod tips:由于虚拟机用的 cloudstack,vm 的地址做过转换,所以 publicIPS:得都写上 minion 的内外网地址 (三) 在 minion 机器上创建目录 /wwwlog Tips:以下操作在 minion 上操作 root@minion-94:~# mkdir /wwwlog root@minion-94:~# ll /wwwlog/ total 4 drwxr-xr-x 2 root root 6 Apr 13 17:20 ./ drwxr-xr-x 23 root root 4096 Apr 13 17:20 ../ tpis:未启动容器前该目录为空 (四) 创建 replication,service Tips:以下操作在 master 上实现 # kubectl create -f nginx-rc.yaml webcontrolle # kubectl create -f nginx-service.yaml webservice (五) 查看是否创建成功: # kubectl get pods By jack.yan POD IP CONTAINER(S) IMAGE(S) HOST LABELS STATUS CREATED webcontroller-h3x9k 192.168.63.10 webserver tutum/nginx 172.20.0.95/172.20.0.95 name=webserver_pod Running About a minute webcontroller-pjzb3 192.168.96.11 webserver tutum/nginx 172.20.0.94/172.20.0.94 name=webserver_pod Running About a minute # kubectl get services NAME LABELS SELECTOR IP PORT kubernetes component=apiserver,provider=kubernetes 10.1.100.2 443 kubernetes-ro component=apiserver,provider=kubernetes 10.1.100.1 80 webservice name=webserver_pod name=webserver_pod 10.1.100.152 40080 # kubectl get rc CONTROLLER CONTAINER(S) IMAGE(S) SELECTOR REPLICAS webcontroller webserver tutum/nginx name=webserver_pod 2 也可以通过查看事件去查看: # kubectl get event Tips:如果出现容器启动失败或者出现问题可以查看 event 事件,找出原因 (六) 登录到 minion 上查看运行的容器: Tips:以下操作在 minion 上实现 root@minion-94:~# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3b0c330f1e59 tutum/nginx:latest "/usr/sbin/nginx" 7 minutes ago Up 7 minutes k8s_webserver.c4f215e5_webcontroller-pjzb3_default_842276ca-e1be-11e4-b88c-020003c 00049_df5deaa2 361bf3a5f59e kubernetes/pause:go "/pause" 7 minutes ago Up 7 minutes k8s_POD.c32decb9_webcontroller-pjzb3_default_842276ca-e1be-11e4-b88c-020003c00049_5e4 e9d39 root@minion-95:~# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES fcb70d762c5e tutum/nginx:latest "/usr/sbin/nginx" 9 minutes ago Up 9 minutes k8s_webserver.c4f215e5_webcontroller-h3x9k_default_8422b76c-e1be-11e4-b88c-020003c0004 By jack.yan 9_f4c50c9c 229b4a80e192 kubernetes/pause:go "/pause" 9 minutes ago Up 9 minutes k8s_POD.c32decb9_webcontroller-h3x9k_default_8422b76c-e1be-11e4-b88c-020003c00049_25 bd3629 可以看到启动了 2 个目标容器和 2 个 k8s 的容器(转发端口使用) 3.6 功能性验证 3.6.1 跨主机容器连通性验证: 由上可以看到容器的 ip 为:192.168.63.10,192.168.96.11 root@minion-94:~# ping 192.168.63.10 -c 4 PING 192.168.63.10 (192.168.63.10) 56(84) bytes of data. 64 bytes from 192.168.63.10: icmp_seq=1 ttl=61 time=0.957 ms --------------- --- 192.168.63.10 ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 3004ms rtt min/avg/max/mdev = 0.957/1.100/1.167/0.083 ms root@minion-94:~# ping 192.168.96.11 -c 4 PING 192.168.96.11 (192.168.96.11) 56(84) bytes of data. 64 bytes from 192.168.96.11: icmp_seq=1 ttl=64 time=0.098 ms --------------------- --- 192.168.96.11 ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 3000ms rtt min/avg/max/mdev = 0.045/0.066/0.098/0.020 ms 3.6.2 访问容器 为了方便看到效果,修改容器中 http 服务的主页: root@minion-94:~# docker exec -t -i 3b0c330f1e59 /bin/bash root@webcontroller-pjzb3:/# echo "hello word minion1" >/app/index.html By jack.yan root@minion-95:~# docker exec -t -i fcb70d762c5e /bin/bash root@webcontroller-h3x9k:/# echo "hello word minion2" >/app/index.html 一、访问 docker 提供的 http 服务(直连容器访问): root@minion-94:~# curl -s http://192.168.96.11 hello word minion1 root@minion-94:~# curl -s http://192.168.63.10 hello word minion2 root@minion-94:~# ll /wwwlog/ total 8 drwxr-xr-x 2 root root 39 Apr 13 17:21 ./ drwxr-xr-x 23 root root 4096 Apr 13 17:20 ../ -rw-r--r-- 1 root root 89 Apr 13 17:36 access.log -rw-r--r-- 1 root root 0 Apr 13 17:21 error.log 可以看到容器内 http 的访问日志挂载到本地目录成功 二、外网访问容器访问: 先查看 iptable 的转发规则(查看最后几行即可): root@minion-94:~# iptables -nvL -t nat Chain KUBE-PORTALS-HOST (1 references) pkts bytes target prot opt in out source destination 0 0 DNAT tcp -- * * 0.0.0.0/0 10.1.100.1 /* kubernetes-ro */ tcp dpt:80 to:10.1.1.30:37790 0 0 DNAT tcp -- * * 0.0.0.0/0 10.1.100.2 /* kubernetes */ tcp dpt:443 to:10.1.1.30:36602 0 0 DNAT tcp -- * * 0.0.0.0/0 10.1.100.152 /* webservice */ tcp dpt:40080 to:10.1.1.30:42296 访问: root@master:/kubernet-config# curl http://172.20.0.94:42296 hello word minion1 root@master:/kubernet-config# curl http://172.20.0.94:42296 hello word minion2 或者: root@minion-95:~# curl http://172.20.0.95:58938 hello word minion1 root@minion-95:~# curl http://172.20.0.95:58938 By jack.yan hello word minion2 或者可以直接访问 http://minion_ip:/service_port tips:可以看到通过 service 映射的端口访问为轮询访问容器。 3.6.3 容器状态强一致性验证: 1. 自动恢复: 杀掉 docker 的一个容器 root@minion-94:~# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3b0c330f1e59 tutum/nginx:latest "/usr/sbin/nginx" 49 minutes ago Up 49 minutes k8s_webserver.c4f215e5_webcontroller-pjzb3_default_842276ca-e1be-11e4-b88c-020003c0004 9_df5deaa2 361bf3a5f59e kubernetes/pause:go "/pause" 49 minutes ago Up 49 minutes k8s_POD.c32decb9_webcontroller-pjzb3_default_842276ca-e1be-11e4-b88c-020003c00049_5e4 e9d39 root@minion-94:~# docker kill 3b0c330f1e59 3b0c330f1e59 root@minion-94:~# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 361bf3a5f59e kubernetes/pause:go "/pause" 50 minutes ago Up 50 minutes k8s_POD.c32decb9_webcontroller-pjzb3_default_842276ca-e1be-11e4-b88c-020003c00049_5e4 e9d39 可以看到启动的容器被关掉了,观察是否会自动启动一个容器: root@minion-94:~# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 0e765f47f678 tutum/nginx:latest "/usr/sbin/nginx" 8 seconds ago Up 8 seconds k8s_webserver.c4f215e5_webcontroller-pjzb3_default_842276ca-e1be-11e4-b88c-020003c0004 9_6b7587df By jack.yan 361bf3a5f59e kubernetes/pause:go "/pause" 50 minutes ago Up 50 minutes k8s_POD.c32decb9_webcontroller-pjzb3_default_842276ca-e1be-11e4-b88c-020003c00049_5e4 e9d39 Tips:已经重新生成一个容器: 删掉一个 pod: root@master:/kubernet-config# kubectl get pod POD IP ONTAINER(S) IMAGE(S) HOST LABELS STATUS CREATED webcontroller-h3x9k 192.168.63.10 webserver tutum/nginx 172.20.0.95/172.20.0.95 name=webserver_pod Running 52 minutes webcontroller-pjzb3 192.168.96.11 webserver tutum/nginx 172.20.0.94/172.20.0.94 name=webserver_pod Running 52 minutes root@master:/kubernet-config# kubectl delete pod webcontroller-h3x9k webcontroller-h3x9k root@master:/kubernet-config# kubectl get pod POD IP CONTAINER(S) IMAGE(S) HOST LABELS STATUS CREATED webcontroller-fplln webserver tutum/nginx 172.20.0.95/172.20.0.95 name=webserver_pod Pending 1 seconds webcontroller-pjzb3 192.168.96.11 webserver tutum/nginx 172.20.0.94/172.20.0.94 name=webserver_pod Running 52 minutes root@master:/kubernet-config# kubectl get pod POD IP CONTAINER(S) IMAGE(S) HOST LABELS STATUS CREATED webcontroller-fplln 192.168.63.11 webserver tutum/nginx 172.20.0.95/172.20.0.95 name=webserver_pod Running 6 seconds webcontroller-pjzb3 192.168.96.11 webserver utum/nginx 172.20.0.94/172.20.0.94 name=webserver_pod Running 52 minutes 2. 动态调整 replication 的副本数: root@master:/kubernet-config# kubectl get rc CONTROLLER CONTAINER(S) IMAGE(S) SELECTOR REPLICAS webcontroller webserver tutum/nginx name=webserver_pod 2 root@master:/kubernet-config# kubectl resize rc webcontroller --replicas=4 resized root@master:/kubernet-config# kubectl get rc CONTROLLER CONTAINER(S) IMAGE(S) SELECTOR REPLICAS webcontroller webserver tutum/nginx name=webserver_pod 4 root@master:/kubernet-config# kubectl get pod POD IP CONTAINER(S) IMAGE(S) HOST LABELS STATUS CREATED webcontroller-fplln 192.168.63.11 webserver tutum/nginx 172.20.0.95/172.20.0.95 name=webserver_pod Running 5 minutes webcontroller-gziey 192.168.96.12 webserver tutum/nginx 172.20.0.94/172.20.0.94name=webserver_pod Running 10 seconds webcontroller-oh43e 192.168.63.12 webservertutum/nginx 172.20.0.95/172.20.0.95name=webserver_pod Running 10 seconds By jack.yan webcontroller-pjzb3 192.168.96.11 webservertutum/nginx172.20.0.94/172.20.0.94 name=webserver_pod Running 58 minutes tips:动态调整容器数量不会造成 service 转发端口的更改,增大的,不影响运行的容器, 停掉 replicationController 会停掉所有运行的容器,增加 minion 节点可以在 apiserver 的配置 文件中添加或者通过 kubectl 来增加 3.7 未完待续: 后续会整理将 ceph 存储作为数据盘挂载到容器中。
还剩31页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 10 金币 [ 分享pdf获得金币 ] 2 人已下载

下载pdf

pdf贡献者

gegenana

贡献于2016-06-16

下载需要 10 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf