目录
CI/CD
Docker
安装
镜像的常用命令
容器的常用命令
常见其他命令
命令小结
用Dockerfile构建镜像
数据卷
docker-compose
docker-compose yml 配置指令参考
version
build
cap_add,cap_drop
cgroup_parent
command
container_name
depends_on
deploy
devices
dns
dns_search
entrypoint
env_file
environment
expose
extra_hosts
healthcheck
image
logging
network_mode
restart
secrets
security_opt
stop_grace_period
stop_signal
sysctls
tmpfs
ulimits
volumes
网络
Docker开发 + 阿里云容器镜像服务
Kubernetes
Kubernetes Dashboard
Ansible
Ansible Tower
Terraform
CI/CD,即Continuous Integration/Continuous Delivery。在公司采用的是 Jenkins 企业版,搭建 pipeline 流程是 Github 代码仓库,构建,单元测试,代码扫描(SonarQube),发布到私库 Nexus,自动部署,回归测试(Fitnesse),邮件通知等。
Docker是一个开源的应用容器引擎,基于Go语言。镜像注册中心(Docker Registry,eg: Docker Hub)可以包含多个仓库(Repository),每个仓库可以包含多个标签(Tag),每个标签对应一个镜像,标签常用于对应该软件的各个版本,latest是默认标签。
公司的Docker和Kubernetes里需要配置相应proxy和vpc,跟我自己电脑安装过程差不多,但公司我是通过Docker从Nexus3里pull相应Kubernetes需要的文件,去使Docker和Kubernetes运行成功。官方下载 Docker Desktop 程序,等待 Docker Desktop is running。
Linux安装的话,可以参考官方文档: Install Docker Engine on CentOS | Docker Documentation
docker version
docker info
docker 命令 --help
Docker命令的使用也可以直接看参考手册:
也可以直接看参考手册: https://docs.docker.com/engine/reference/commandline
1. docker images
2. docker pull
docker pull mysql
等价于 docker pull docker.io/library/mysql:lastest
3. docker build -t <镜像名称> -f
注意“."表示当前目录
4. docker rmi
5. docker search <镜像名字> (或者 Docker Hub中搜索)
docker run [可选参数] image
-i 选项:标准输入设备(STDIN)。
-t 选项:伪终端(Terminal)。
-d 选项:daemon后台方式运行。
-p 选项:多种指定端口方式。
/bin/bash参数:表示运行容器中的bash应用程序。
以root超级管理员身份进入容器,@后面跟的是容器id,/表示所在的路径。
# -q 表示仅列出 CONTAINER ID
docker ps -a -q
方式一:docker exec -it
(可以再进一步 ps -ef 查看容器内进程)
方式二:docker attach
区别:
这种拷贝是手动的,可以使用 -v 卷技术进行容器和主机的自动同步 。
命令 | 描述 | 例子 |
FROM <仓库名称:标签名> | 用于指定基础镜像,定制镜像一定是以一个基础镜像开始,必备且必须是第一条指令。 | FROM centos:lastest |
MAINTAINER |
镜像的作者。 | MAINTAINER "cxf" |
ADD |
复制文件,从宿主机的来源路径到容器内路径,必须是绝对路径。注意会自动解压来源中的压缩包,将解压后的文件复制到目标目录中。 | ADD /c/Users/cxf/jdk-11.tar.gz /opt |
COPY |
复制文件。 | COPY /c/Users/cxf/jdk-11.tar.gz /opt |
RUN |
执行命令,可多条RUN命令。 | RUN ls -l |
CMD | 只允许一次CMD命令,使用多个会抵消之前所有的命令,只有最后一个命令生效。 有3种形式: CMD ["executable", "param1", "param2"] CMD ["param1", "param2"] CMD command param1 param2 |
# 容器启动时执行的命令 CMD /opt/jdk-11/bin/java -version CMD java -jar app.jar |
ENTRYPOINT | 执行命令,可追加命令 | ENTRYPOINT ["ls","-a"] |
注意:将Dockerfile文件与需要添加到容器的文件放在同一个目录下。
(1)ADD 和 COPY 的区别:
add
和 copy
都是复制文件 / 文件夹add
可以从网络 / 本地复制; copy
仅从本地复制, 语义更明确, 推荐使用 copy。
(2)CMD 和 ENTRYPOINT 的区别:
ENTRYPOINT可追加。
容器的持久化和同步操作,容器间可以数据共享。卷技术把容器的目录挂载到Linux宿主机上。
方式一(命令):
-v 主机目录:容器内目录
方式二(Dockerfile):
VOLUMN ["volumn1", "volumn2"] # 匿名挂载
docker volumn ls 查看数据卷
docker volumn inspect <卷名> 可查看卷具体挂载的位置,即"Mountpoint"。
具名挂载与匿名挂载:
匿名挂载可以只指定容器内目录。所有的数据卷如果没指定宿主机目录的情况下,默认挂载在/var/lib/docker/volumns/<卷名>/_data
具名挂载可通过 <卷名>:<容器目录> 指定数据卷的具体名字。
扩展:
-v 容器内目录:ro rw 可以改变读写权限,ro:readonly,rw:readwrite读写。
--volumn-from <容器名字> 可以实现容器间数据共享。
Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。
Compose 使用的三个步骤:
使用 Dockerfile 定义应用程序的环境。
使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
最后,执行 docker-compose up 命令来启动并运行整个应用程序。
# yaml 配置实例
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
- logvolume01:/var/log
links:
- redis
redis:
image: redis
volumes:
logvolume01: {}
Compose 安装
Linux 上我们可以从 Github 上下载它的二进制包来使用,最新发行的版本地址:https://github.com/docker/compose/releases。
运行以下命令以下载 Docker Compose 的当前稳定版本:
$ sudo curl -L "https://github.com/docker/compose/releases/download/v2.2.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
要安装其他版本的 Compose,请替换 v2.2.2。
Docker Compose 存放在 GitHub,不太稳定。
你可以也通过执行下面的命令,高速安装 Docker Compose。
curl -L https://get.daocloud.io/docker/compose/releases/download/v2.4.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
将可执行权限应用于二进制文件:
$ sudo chmod +x /usr/local/bin/docker-compose
创建软链:
$ sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
测试是否安装成功:
$ docker-compose --version cker-compose version 1.24.1, build 4667896b
注意: 对于 alpine,需要以下依赖包: py-pip,python-dev,libffi-dev,openssl-dev,gcc,libc-dev,和 make。
macOS
Mac 的 Docker 桌面版和 Docker Toolbox 已经包括 Compose 和其他 Docker 应用程序,因此 Mac 用户不需要单独安装 Compose。
windows PC
Windows 的 Docker 桌面版和 Docker Toolbox 已经包括 Compose 和其他 Docker 应用程序,因此 Windows 用户不需要单独安装 Compose。
使用
1、准备
创建一个测试目录:
$ mkdir composetest $ cd composetest
在测试目录中创建一个名为 app.py 的文件,并复制粘贴以下内容:
composetest/app.py 文件代码
import time
import redis
from flask import Flask
app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)
def get_hit_count():
retries = 5
while True:
try:
return cache.incr('hits')
except redis.exceptions.ConnectionError as exc:
if retries == 0:
raise exc
retries -= 1
time.sleep(0.5)
@app.route('/')
def hello():
count = get_hit_count()
return 'Hello World! I have been seen {} times.\n'.format(count)
在此示例中,redis 是应用程序网络上的 redis 容器的主机名,该主机使用的端口为 6379。
在 composetest 目录中创建另一个名为 requirements.txt 的文件,内容如下:
flask redis
2、创建 Dockerfile 文件
在 composetest 目录中,创建一个名为 Dockerfile 的文件,内容如下:
FROM python:3.7-alpine WORKDIR /code ENV FLASK_APP app.py ENV FLASK_RUN_HOST 0.0.0.0 RUN apk add --no-cache gcc musl-dev linux-headers COPY requirements.txt requirements.txt RUN pip install -r requirements.txt COPY . . CMD ["flask", "run"]
Dockerfile 内容解释:
ENV FLASK_APP app.py ENV FLASK_RUN_HOST 0.0.0.0
设置 flask 命令使用的环境变量。
COPY requirements.txt requirements.txt RUN pip install -r requirements.txt
复制 requirements.txt 并安装 Python 依赖项。
3、创建 docker-compose.yml
在测试目录中创建一个名为 docker-compose.yml 的文件,然后粘贴以下内容:
docker-compose.yml 配置文件
# yaml 配置
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
该 Compose 文件定义了两个服务:web 和 redis。
4、使用 Compose 命令构建和运行您的应用
在测试目录中,执行以下命令来启动应用程序:
docker-compose up
如果你想在后台执行该服务可以加上 -d 参数:
docker-compose up -d
https://docs.docker.com/compose/compose-file/
指定本 yml 依从的 compose 哪个版本制定的。
指定为构建镜像上下文路径:
例如 webapp 服务,指定为从上下文路径 ./dir/Dockerfile 所构建的镜像:
version: "3.7" services: webapp: build: ./dir
或者,作为具有在上下文指定的路径的对象,以及可选的 Dockerfile 和 args:
version: "3.7" services: webapp: build: context: ./dir dockerfile: Dockerfile-alternate args: buildno: 1 labels: - "com.example.description=Accounting webapp" - "com.example.department=Finance" - "com.example.label-with-empty-value" target: prod
添加或删除容器拥有的宿主机的内核功能。
cap_add: - ALL # 开启全部权限 cap_drop: - SYS_PTRACE # 关闭 ptrace权限
为容器指定父 cgroup 组,意味着将继承该组的资源限制。
cgroup_parent: m-executor-abcd
覆盖容器启动的默认命令。
command: ["bundle", "exec", "thin", "-p", "3000"]
指定自定义容器名称,而不是生成的默认名称。
container_name: my-web-container
设置依赖关系。
version: "3.7" services: web: build: . depends_on: - db - redis redis: image: redis db: image: postgres
注意:web 服务不会等待 redis db 完全启动 之后才启动。
指定与服务的部署和运行有关的配置。只在 swarm 模式下才会有用。
version: "3.7" services: redis: image: redis:alpine deploy: mode:replicated replicas: 6 endpoint_mode: dnsrr labels: description: "This redis service label" resources: limits: cpus: '0.50' memory: 50M reservations: cpus: '0.25' memory: 20M restart_policy: condition: on-failure delay: 5s max_attempts: 3 window: 120s
可以选参数:
endpoint_mode:访问集群服务的方式。
endpoint_mode: vip # Docker 集群服务一个对外的虚拟 ip。所有的请求都会通过这个虚拟 ip 到达集群服务内部的机器。 endpoint_mode: dnsrr # DNS 轮询(DNSRR)。所有的请求会自动轮询获取到集群 ip 列表中的一个 ip 地址。
labels:在服务上设置标签。可以用容器上的 labels(跟 deploy 同级的配置) 覆盖 deploy 下的 labels。
mode:指定服务提供的模式。
replicated:复制服务,复制指定服务到集群的机器上。
global:全局服务,服务将部署至集群的每个节点。
图解:下图中黄色的方块是 replicated 模式的运行情况,灰色方块是 global 模式的运行情况。
replicas:mode 为 replicated 时,需要使用此参数配置具体运行的节点数量。
resources:配置服务器资源使用的限制,例如上例子,配置 redis 集群运行需要的 cpu 的百分比 和 内存的占用。避免占用资源过高出现异常。
restart_policy:配置如何在退出容器时重新启动容器。
rollback_config:配置在更新失败的情况下应如何回滚服务。
update_config:配置应如何更新服务,对于配置滚动更新很有用。
注:仅支持 V3.4 及更高版本。
指定设备映射列表。
devices: - "/dev/ttyUSB0:/dev/ttyUSB0"
自定义 DNS 服务器,可以是单个值或列表的多个值。
dns: 8.8.8.8 dns: - 8.8.8.8 - 9.9.9.9
自定义 DNS 搜索域。可以是单个值或列表。
dns_search: example.com dns_search: - dc1.example.com - dc2.example.com
覆盖容器默认的 entrypoint。
entrypoint: /code/entrypoint.sh
也可以是以下格式:
entrypoint: - php - -d - zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20100525/xdebug.so - -d - memory_limit=-1 - vendor/bin/phpunit
从文件添加环境变量。可以是单个值或列表的多个值。
env_file: .env
也可以是列表格式:
env_file: - ./common.env - ./apps/web.env - /opt/secrets.env
添加环境变量。您可以使用数组或字典、任何布尔值,布尔值需要用引号引起来,以确保 YML 解析器不会将其转换为 True 或 False。
environment: RACK_ENV: development SHOW: 'true'
暴露端口,但不映射到宿主机,只被连接的服务访问。
仅可以指定内部端口为参数:
expose: - "3000" - "8000"
添加主机名映射。类似 docker client --add-host。
extra_hosts: - "somehost:162.242.195.82" - "otherhost:50.31.209.229"
以上会在此服务的内部容器中 /etc/hosts 创建一个具有 ip 地址和主机名的映射关系:
162.242.195.82 somehost 50.31.209.229 otherhost
用于检测 docker 服务是否健康运行。
healthcheck: test: ["CMD", "curl", "-f", "http://localhost"] # 设置检测程序 interval: 1m30s # 设置检测间隔 timeout: 10s # 设置检测超时时间 retries: 3 # 设置重试次数 start_period: 40s # 启动后,多少秒开始启动检测程序
指定容器运行的镜像。以下格式都可以:
image: redis image: ubuntu:14.04 image: tutum/influxdb image: example-registry.com:4000/postgresql image: a4bc65fd # 镜像id
服务的日志记录配置。
driver:指定服务容器的日志记录驱动程序,默认值为json-file。有以下三个选项
driver: "json-file" driver: "syslog" driver: "none"
仅在 json-file 驱动程序下,可以使用以下参数,限制日志得数量和大小。
logging: driver: json-file options: max-size: "200k" # 单个文件大小为200k max-file: "10" # 最多10个文件
当达到文件限制上限,会自动删除旧得文件。
syslog 驱动程序下,可以使用 syslog-address 指定日志接收地址。
logging: driver: syslog options: syslog-address: "tcp://192.168.0.42:123"
设置网络模式。
network_mode: "bridge" network_mode: "host" network_mode: "none" network_mode: "service:[service name]" network_mode: "container:[container name/id]"
networks
配置容器连接的网络,引用顶级 networks 下的条目 。
services: some-service: networks: some-network: aliases: - alias1 other-network: aliases: - alias2 networks: some-network: # Use a custom driver driver: custom-driver-1 other-network: # Use a custom driver which takes special options driver: custom-driver-2
aliases :同一网络上的其他容器可以使用服务名称或此别名来连接到对应容器的服务。
restart: "no" restart: always restart: on-failure restart: unless-stopped
注:swarm 集群模式,请改用 restart_policy。
存储敏感数据,例如密码:
version: "3.1" services: mysql: image: mysql environment: MYSQL_ROOT_PASSWORD_FILE: /run/secrets/my_secret secrets: - my_secret secrets: my_secret: file: ./my_secret.txt
修改容器默认的 schema 标签。
security-opt: - label:user:USER # 设置容器的用户标签 - label:role:ROLE # 设置容器的角色标签 - label:type:TYPE # 设置容器的安全策略标签 - label:level:LEVEL # 设置容器的安全等级标签
指定在容器无法处理 SIGTERM (或者任何 stop_signal 的信号),等待多久后发送 SIGKILL 信号关闭容器。
stop_grace_period: 1s # 等待 1 秒 stop_grace_period: 1m30s # 等待 1 分 30 秒
默认的等待时间是 10 秒。
设置停止容器的替代信号。默认情况下使用 SIGTERM 。
以下示例,使用 SIGUSR1 替代信号 SIGTERM 来停止容器。
stop_signal: SIGUSR1
设置容器中的内核参数,可以使用数组或字典格式。
sysctls: net.core.somaxconn: 1024 net.ipv4.tcp_syncookies: 0 sysctls: - net.core.somaxconn=1024 - net.ipv4.tcp_syncookies=0
在容器内安装一个临时文件系统。可以是单个值或列表的多个值。
tmpfs: /run tmpfs: - /run - /tmp
覆盖容器默认的 ulimit。
ulimits: nproc: 65535 nofile: soft: 20000 hard: 40000
将主机的数据卷或着文件挂载到容器里。
version: "3.7" services: db: image: postgres:latest volumes: - "/localhost/postgres.sock:/var/run/postgres/postgres.sock" - "/localhost/data:/var/lib/postgresql/data"
可参考:
Docker网络详解与实战_Code0cean的博客-CSDN博客_docker网络
1、Dockerfile
#基础镜像
FROM centos:centos7
#将jdk8包放入/usr/local/src并自动解压,jdk8.tar.gz 需要到oracle官方下载,注意解压后的java版本号
ADD jdk8.tar.gz /usr/local/src
COPY tailbaseSampling-1.0-SNAPSHOT.jar /usr/local/src
WORKDIR /usr/local/src
COPY start.sh /usr/local/src
RUN chmod +x /usr/local/src/start.sh
ENTRYPOINT ["/bin/bash", "/usr/local/src/start.sh"]
2、start.sh
if [ $SERVER_PORT ];
then
/usr/local/src/jdk1.8.0_251/bin/java -Dserver.port=$SERVER_PORT -jar /usr/local/src/tailbaseSampling-1.0-SNAPSHOT.jar &
else
/usr/local/src/jdk1.8.0_251/bin/java -Dserver.port=8000 -jar /usr/local/src/tailbaseSampling-1.0-SNAPSHOT.jar &
fi
tail -f /usr/local/src/start.sh
3、IDE + Cloud Toolkit
推荐使用 Alibaba Cloud Toolkit 进行操作。Cloud Toolkit 与主流 IDE 及阿里云容器镜像服务无缝集成,可以简化操作。 这里以在 IntelliJ IDEA 中使用 Alibaba Cloud Toolkit 为例。只需配置一次,之后都可一键推送~
a. 在本地 IDE 中安装 Alibaba Cloud Toolkit 并进行阿里云账户配置。参见:
在 IntelliJ IDEA 中安装和配置 Cloud Toolkit
b. 设置用于打包本地镜像的 Docker 环境。
§ 在 IntelliJ IDEA 工具栏单击 Tools > Alibaba Cloud > Preferences… 。
§ 在 Settings 对话框的左侧导航栏中单击 Docker。
§ 在 Docker 界面中设置 Cloud Toolkit 需要连接的 Docker 环境。
□ 本地为 Mac 或 Linux 操作系统,勾选 Unix Socket,然后单击 Browse,输入unix:///var/run/docker.sock。
□ 本地为 Windows 操作系统,勾选 TCP Connection,然后在 URI 右侧文档框输入本地 Docker 的 URI,如 http://127.0.0.1:2375。
□ 远程 Docker 环境:勾选 Tcp Connection,在 URI 右侧的文本框里输入远端的 Docker 环境的 URI(包括 IP 地址和端口),如 http://x.x.x.x:2375,并确保远程主机的 HTTP 服务开启。
单击 Test Connection 进行连接测试。
注意:如果出现连接测试报错,可进入 Docker 的 Settings 界面,单击左侧导航栏中的 General,然后选择 Expose daemon on tcp://localhost:2375 without TLS。
c. 构建并上传应用
§ 在 IntelliJ IDEA 的菜单栏中选择 File > Open… ,选择参赛的工程文件。
§ 在 IntelliJ IDEA 界面左侧的 Project 中右键单击您的 Docker 应用工程名,在弹出的下拉菜单中选择 Alibaba Cloud > Deploy to Registry
§ 在 Deploy to Registry对话框中进行以下配置。
□ 在 Image 页签中选择 Context Directory 和 Dockerfile。
□ Context Directory:参赛的工程文件所在的目录,例如上文中的 tianchi 。
□ Dockerfile:选择上文中创建的 Dockerfile。
□ Version:对上传的工程文件做版本标记。例如 1.0
□ 在 Image Repositories 区域选择上文中创建的容器镜像服务的地域、命名空间和镜像仓库。
§ 单击RUN
d. IDE + Cloud Toolkit的截图:
Push镜像成功:
第二次替换了1.0版本:
4. 启动过程
Chens-MacBook-Pro:tianchi_submit_demo cxf$ docker login --username=beth阿同 registry.cn-shanghai.aliyuncs.com
Password:
Login Succeeded
密码就是跟PC电脑一样的
docker pull registry.cn-shanghai.aliyuncs.com/bethchen/test_for_tianchi:1.0
docker run --rm -it --net host -e "SERVER_PORT=8000" --name "clientprocess1" -d registry.cn-shanghai.aliyuncs.com/bethchen/test_for_tianchi:1.0
docker run --rm -it --net host -e "SERVER_PORT=8001" --name "clientprocess2" -d registry.cn-shanghai.aliyuncs.com/bethchen/test_for_tianchi:1.0
docker run --rm -it --net host -e "SERVER_PORT=8002" --name "backendprocess" -d registry.cn-shanghai.aliyuncs.com/bethchen/test_for_tianchi:1.0
docker pull registry.cn-hangzhou.aliyuncs.com/cloud_native_match/scoring:0.1
docker run --rm --net host -e "SERVER_PORT=8081" --name scoring -d registry.cn-hangzhou.aliyuncs.com/cloud_native_match/scoring:0.1
docker ps
bethxfchen:~ cxf$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f00a5f153d95 registry.cn-hangzhou.aliyuncs.com/cloud_native_match/scoring:0.1 "/bin/bash /usr/loca…" 3 seconds ago Up 3 seconds scoring
517c820d0368 registry.cn-shanghai.aliyuncs.com/bethchen/test_for_tianchi:1.0 "/bin/bash /usr/loca…" 3 minutes ago Up 3 minutes backendprocess
9f88820a7919 registry.cn-shanghai.aliyuncs.com/bethchen/test_for_tianchi:1.0 "/bin/bash /usr/loca…" 4 minutes ago Up 4 minutes clientprocess2
b5d364cf54b1 registry.cn-shanghai.aliyuncs.com/bethchen/test_for_tianchi:1.0 "/bin/bash /usr/loca…" 4 minutes ago Up 4 minutes
查看log: docker log --follow
在 Docker Desktop 中 Preferences => Kubernetes => Enable Kubernetes 后,如果一直停留在 Kubernetes is starting 的状态,是因为相关 images 没有下载完全,可以用 k8s-for-docker-desktop 来安装,安装好重启等待几分钟就好。
解决方式如下,
1、卸载docker(看具体情况)
卸载之后别忘了配置阿里源
{
"experimental": true,
"debug": true,
"registry-mirrors": [
"https://xxx.mirror.aliyuncs.com"
]
}
2、查看hosts
127.0.0.1 localhost
255.255.255.255 broadcasthost
::1 localhost
#Added by Docker Desktop
#To allow the same kube context to work on the host and the container:
127.0.0.1 kubernetes.docker.internal
#End of section
3、删除相关文件
rm -rf ~/.docker
rm -rf ~/.kube
rm -rf ~/Library/Group\ Containers/group.com.docker/pki/
4、安装相关images文件
到k8s-for-docker-desktop上面clone项目,在 Mac 上执行如下脚本,
./load_images.sh
5、安装完成后,重启Docker和Kubernetes等待时间完成即可
可看到桌面角标提示 Kubernetes is running
输入 kubectl proxy 命令,查看 127.0.0.1:8001:
bethxfchen:~ cxf$ kubectl proxy
Starting to serve on 127.0.0.1:8001
输入 kubectl 探索常见命令:
bethxfchen:~ cxf$ kubectl
kubectl controls the Kubernetes cluster manager.
Find more information at: https://kubernetes.io/docs/reference/kubectl/overview/
Basic Commands (Beginner):
create Create a resource from a file or from stdin.
expose Take a replication controller, service, deployment or pod and expose it as a new Kubernetes Service
run Run a particular image on the cluster
set Set specific features on objects
Basic Commands (Intermediate):
explain Documentation of resources
get Display one or many resources
edit Edit a resource on the server
delete Delete resources by filenames, stdin, resources and names, or by resources and label selector
Deploy Commands:
rollout Manage the rollout of a resource
scale Set a new size for a Deployment, ReplicaSet or Replication Controller
autoscale Auto-scale a Deployment, ReplicaSet, or ReplicationController
Cluster Management Commands:
certificate Modify certificate resources.
cluster-info Display cluster info
top Display Resource (CPU/Memory/Storage) usage.
cordon Mark node as unschedulable
uncordon Mark node as schedulable
drain Drain node in preparation for maintenance
taint Update the taints on one or more nodes
Troubleshooting and Debugging Commands:
describe Show details of a specific resource or group of resources
logs Print the logs for a container in a pod
attach Attach to a running container
exec Execute a command in a container
port-forward Forward one or more local ports to a pod
proxy Run a proxy to the Kubernetes API server
cp Copy files and directories to and from containers.
auth Inspect authorization
debug Create debugging sessions for troubleshooting workloads and nodes
Advanced Commands:
diff Diff live version against would-be applied version
apply Apply a configuration to a resource by filename or stdin
patch Update field(s) of a resource
replace Replace a resource by filename or stdin
wait Experimental: Wait for a specific condition on one or many resources.
kustomize Build a kustomization target from a directory or a remote url.
Settings Commands:
label Update the labels on a resource
annotate Update the annotations on a resource
completion Output shell completion code for the specified shell (bash or zsh)
Other Commands:
api-resources Print the supported API resources on the server
api-versions Print the supported API versions on the server, in the form of "group/version"
config Modify kubeconfig files
plugin Provides utilities for interacting with plugins.
version Print the client and server version information
Usage:
kubectl [flags] [options]
Use "kubectl --help" for more information about a given command.
Use "kubectl options" for a list of global command-line options (applies to all commands).
比如 kubectl get namespace 等,更详细的其他信息可以查看 kubectl get --help:
可参考官方GitHub:https://github.com/kubernetes/dashboard
Deploy Dashboard,执行以下命令:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.4/aio/deploy/recommended.yaml
访问 UI:http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/#!/login
我们采用令牌的方式进行登录,首先创建管理员角色,新建一个名为k8s-admin.yaml
的文件,内容如下:
apiVersion: v1
kind: ServiceAccount
metadata:
name: dashboard-admin
namespace: kube-system
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: dashboard-admin
subjects:
- kind: ServiceAccount
name: dashboard-admin
namespace: kube-system
roleRef:
kind: ClusterRole
name: cluster-admin
apiGroup: rbac.authorization.k8s.io
在命令行中进入到k8s-admin.yaml
文件所在目录,执行下面命令添加管理员角色
bethxfchen:kubernetes cxf$ kubectl create -f k8s-admin.yaml
serviceaccount/dashboard-admin created
Warning: rbac.authorization.k8s.io/v1beta1 ClusterRoleBinding is deprecated in v1.17+, unavailable in v1.22+; use rbac.authorization.k8s.io/v1 ClusterRoleBinding
clusterrolebinding.rbac.authorization.k8s.io/dashboard-admin created
bethxfchen:kubernetes cxf$ kubectl get secret -n kube-system
NAME TYPE DATA AGE
attachdetach-controller-token-h7pj6 kubernetes.io/service-account-token 3 25m
bootstrap-signer-token-r5ztx kubernetes.io/service-account-token 3 25m
bootstrap-token-abcdef bootstrap.kubernetes.io/token 6 25m
certificate-controller-token-6fhwx kubernetes.io/service-account-token 3 25m
clusterrole-aggregation-controller-token-l5sgk kubernetes.io/service-account-token 3 25m
coredns-token-2zz6b kubernetes.io/service-account-token 3 25m
cronjob-controller-token-ltmps kubernetes.io/service-account-token 3 25m
daemon-set-controller-token-ntknk kubernetes.io/service-account-token 3 25m
dashboard-admin-token-gmr67 kubernetes.io/service-account-token 3 10s
default-token-v4z7x kubernetes.io/service-account-token 3 25m
deployment-controller-token-rcnpd kubernetes.io/service-account-token 3 25m
disruption-controller-token-7fkxz kubernetes.io/service-account-token 3 25m
endpoint-controller-token-lsrkh kubernetes.io/service-account-token 3 25m
endpointslice-controller-token-n9st8 kubernetes.io/service-account-token 3 25m
endpointslicemirroring-controller-token-gcl5h kubernetes.io/service-account-token 3 25m
expand-controller-token-jvfp8 kubernetes.io/service-account-token 3 25m
generic-garbage-collector-token-c4795 kubernetes.io/service-account-token 3 25m
horizontal-pod-autoscaler-token-6pwsd kubernetes.io/service-account-token 3 25m
job-controller-token-qkfp5 kubernetes.io/service-account-token 3 25m
kube-proxy-token-l66vq kubernetes.io/service-account-token 3 25m
namespace-controller-token-7mhw7 kubernetes.io/service-account-token 3 25m
node-controller-token-ckgvw kubernetes.io/service-account-token 3 25m
persistent-volume-binder-token-qtg47 kubernetes.io/service-account-token 3 25m
pod-garbage-collector-token-8fr7l kubernetes.io/service-account-token 3 25m
pv-protection-controller-token-fcgg2 kubernetes.io/service-account-token 3 25m
pvc-protection-controller-token-fvrh7 kubernetes.io/service-account-token 3 25m
replicaset-controller-token-d8drp kubernetes.io/service-account-token 3 25m
replication-controller-token-kfssb kubernetes.io/service-account-token 3 25m
resourcequota-controller-token-4nrzh kubernetes.io/service-account-token 3 25m
service-account-controller-token-qvl5p kubernetes.io/service-account-token 3 25m
service-controller-token-bc645 kubernetes.io/service-account-token 3 25m
statefulset-controller-token-tcmzj kubernetes.io/service-account-token 3 25m
storage-provisioner-token-mvzcs kubernetes.io/service-account-token 3 24m
token-cleaner-token-hc27r kubernetes.io/service-account-token 3 25m
ttl-controller-token-nzwlc kubernetes.io/service-account-token 3 25m
kit-controller-token-vzjht kubernetes.io/service-account-token 3 24m
找到 dashboard-admin-token 前缀的一行,执行 kubectl describe secret dashboard-admin-token-gmr67 -n kube-system 如下:
bethxfchen:kubernetes cxf$ kubectl describe secret dashboard-admin-token-gmr67 -n kube-system
Name: dashboard-admin-token-gmr67
Namespace: kube-system
Labels:
Annotations: kubernetes.io/service-account.name: dashboard-admin
kubernetes.io/service-account.uid: 955e6cb5-a91d-4ad3-820a-3ad0adb47d14
Type: kubernetes.io/service-account-token
Data
====
ca.crt: 1066 bytes
namespace: 11 bytes
token: eyJhbGciOiJSUzI1NiIsImtpZCI6ImJOcmNhWVFlU3RPTHlFMkNuZHpGaFpfb25FdS10SENzdVpmTXplUEFMTm8ifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlc
(此处省略完整 token 后面部分)
在 Kubernetes Dashboard 中输入 token,即可登录:
Dashboard 对应命令行:
当然也可以考虑minikube快速搭建,minikube 是 K8S 官方为了开发者能在个人电脑上运行 K8S 而提供的一套工具。实现上是通过 Go 语言编写,通过调用虚拟化管理程序,创建出一个运行在虚拟机内的单节点集群。对于 K8S 集群的基本功能而言,节点数并没有什么限制。只有一个节点同样可以创建集群。
推荐 Ansible is Simple IT Automation
Ansible中文权威指南- 国内最专业的Ansible中文官方学习手册
Ansible 特性:
配置自动化,应用部署
(1)新增 epel-release 第三方套件来源。
sudo yum install -y epel-release
(2)安装 Ansible。
sudo yum install -y ansible
ansible --version
[root@localhost bin]# cd /etc/ansible/
[root@localhost ansible]# ls
ansible.cfg hosts roles
[root@localhost ansible]# vim ansible.cfg
ssh-keygen
ssh-copy-id
/etc/ansible/hosts
[root@localhost ansible]# vim hosts
# Ansible 命令格式:ansible ip/hostname -m 模块名
[root@localhost ansible]# ansible localhost -m command -a 'echo Hello World.'
# 输出结果
localhost | CHANGED | rc=0 >>
Hello World.
# Ansible 命令格式:ansible ip/hostname -m 模块名
[root@localhost ~]# ansible localhost -m ping
# 输出结果
localhost | SUCCESS => {
"changed": false,
"ping": "pong"
}
Playbook 采用 YAML 语言编写,Playbook核心元素有 hosts,tasks,variables变量,templates,handlers,tags,条件判断when,字典with_items等。
ansible-playbook YYYY.yml
roles就相当于多个Playbook的集合,完成复杂的任务。
Ansible Galaxy
(ansible-galaxy install XXXX; tree .ansible/roles/)
ansible-vault encrypt data.txt会要求输入一个新的Vault密码。
cat data.txt
view时需要输入设置的Vault密码(不是原始密码),才可以查看原始密码。
ansible-vault decrypt data.txt输入Vault密码,即可解密。再cat data.txt就是原始密码。
ansible-vault rekey data.txt可重置Vault密码。
local的是加密后的数据:
远程传送到的是原始数据:
Ansible Vault实践:
或者ansible-playbook --vault-id=pass.txt vault.yml
Ansible Web界面,一种是直接在web界面操作创建inventory等,企业中一般不会这么做,而是采用另一种,在github上创建inventory,variables,roles,playbook目录等,然后在Ansible Tower指定SCM URL。
下面是第一种:
create an inventory
add host
create a project
add a credential
create a job template
run a job template:
公司的谷歌云项目都是由Ansible+Terraform自动创建资源,然后相关信息会放在Github里。
如果需要更改Infra info,会push到Github上,然后 Terraform会自动扫描GitHub上的更改,系统自动 terraform apply 实现对资源的创建和更新。