devops summary
最后更新2022/01/19
2022年是这样开年,为生活再次屈服了。。。啥时候可以不服呢?怎么觉得没这个可能了?好吧,与生活一致就可以了,叫做心从所欲不逾矩。从今天10点半开始学习devop,还好,有运维,开发,设计,测试,甚至学习的经验,还有啥不行呢?以前想持续做一件事情,做深做透。现实要求做所有的事情,做快,做好。其实并不矛盾。那么,开始。
学习套路一,收集概念,开始搜索关键词(由无序的,无整理的到聚焦);
devops是开发和运维结合的产物,将开发(甚至包括设计)流水线化的结果:
设计->开发->测试->部署/运维->下一个设计-运维循环
DevOps 的三大支柱之中,即人(People)、流程(Process)和平台(Platform):
DevOps = 人 + 流程 + 平台
- 人 + 流程 = 文化(胡扯,一方面是高大上的口号,一方面是相互试应、妥协)
- 流程 + 平台 = 工具(实现,把过程、智能线索通过平台固化)
- 平台 + 人 = 赋能(名词呱呱叫,其实就是人不行,但给个按钮,只做选择的能力还是有的)
人和流程都是虚的,实在的是平台或者工具,用具体工具组成平台或者单独实现,每个都要搞一搞(好多。。。)。
- 项目管理(PM):jira。运营可以上去提问题,可以看到各个问题的完整的工作流,待解决未解决等;
- 代码管理:gitlab。jenkins或者K8S都可以集成gitlab,进行代码管理,上线,回滚等;
- 持续集成CI(Continuous Integration):gitlab ci。开发人员提交了新代码之后,立刻进行构建、(单元)测试。根据测试结果,可以确定新代码和原有代码能否正确地集成在一起;
- 持续交付CD(Continuous Delivery):gitlab cd。完成单元测试后,可以把代码部署到连接数据库的 Staging 环境中更多的测试。如果代码没有问题,可以继续手动部署到生产环境中。镜像仓库:VMware Harbor,私服nexus。
- 容器:Docker
- 编排:K8S
- 服务治理:Consul
- 脚本语言:Python
- 日志管理:Cat+Sentry,还有种常用的是ELK
- 系统监控:Prometheus
- 负载均衡:Nginx
- 网关:Kong,zuul
- 链路追踪:Zipkin
- 产品和UI图:蓝湖?什么鬼东西?!
- 公司内部文档:Confluence
现在似乎有三大体系:azure, aws, google,都有自己一套东西。有朋友介绍他们用的gcp,那就从google cloud platform开始喽,是否最好,最后,未来发展,现在还搞不清楚。
gcp包括4大services
- compute
- compute engine
- kubernetes engine
- app engine
- could foundation
- storage
- bigtable
- cloud storage
- cloud sql
- cloud spanner
- cloud datastore
- big data
- big query
- pub/sub
- data flow
- data proc
- data lab
- machine learning
- natural language api
- vision api
- machine learning
- speech api
- translate api
此外还有一个辅助系统:
- budgets and billing
- budgets and alert
- billing
- export
- reports and quota
git和版本控制
教学video https://www.bilibili.com/video/BV1FE411P7B3?t=211.7
book https://github.com/progit/progit2/releases/download/2.1.336/progit.pdf
版本控制有本地、集中(SVN)、分布式几种,git属于分布式版本控制。分布式的特点是每个client都拥有所有的历史版本及详细信息,冗余度高,不需要联网,但安全性差,空间要求多。
working directory 当前工作的目路
stage/index 暂存区,是个文件
repository 资源库,或者就是当前配置的“根”目录,也是虚的
remote directory
branch分支 master 主分支,虚拟的
- untracked:文件存在目路中,但是未被跟踪,用git add将文件入库,变为stage状态,开始进行版本跟踪
- unmodify:文件在库中,被跟踪,且内容与快照一致。用git rm删除掉(取消跟踪,文件也同时被删掉了)
- modified:文件和跟踪记录不一致,git add(再次add)会更新记录(更新追踪信息?这个没太理解),git checkout则更新当前目录中的文件
- staged:commit之后的状态,文件最终和库中记录一致了,状态会回到unmodify;或者git reset HEAD filename,会rollback commit,回到modified
docker
这是个简装的虚拟机及管理体系
优点、缺点什么的就不说了,虽然重要,但对于我自己太清晰了,什么管理,部署,资源分配等等,不再重复。
client是管理功能
host是service运行功能
registry是储存源包
client build生成资源包
host pull资源包到本地实现部署
host run运行部署后的资源包
所有一切都通过client发送build,pull和run命令,控制docker daemon实现。说完,收工。。。太简单了吧,钱不能这么赚,后面还要回来继续说。
kubernetes(k8s)
- pod包含一组container(至少有一个pause容器),所有同一pod中的container会共用pause容器的网络栈及存储卷
- 一组pod可以运行在一个node上,Node类似一台物理机,当然也可以是一台虚拟机,总之,真正干活的。干什么活,看Pod,一个Pod就是一组工作,这组工作每个都是container,container之间是有关联的,通过pause container把网络和存储关联起来。当然也可以无关。
cell
node
master组件包含:
scheduler接受任务,选择合适的节点运行任务(有足够的资源便于pod运行)
replication controller manager 保持副本的数目,这是个实现高可用的组件,提供冗余、备份及扩展等功能。具体有三种,replication controller(主要负责副本数控制,提供高可用和备份),ReplicaSet & Deployment(新版建议用ReplicaSet替换Replication Controller,好像只是命名,其实是一个概念,但增加了集合式的select,具体来说,RS对RC的扩展是支持标签式的判断,就是对同一类副本,根据标签不同也可区分。这部分理解不太清晰,再研究。RS本身也能deploy,但deployment功能更多,例如支持rolling update。deployment不是个过程,是个组件,创建一个deployment会自动创建一个RS,RS再创建POD,也就是deployment不会直接创建POD,只会创建RS,但deployment可以同时管理RS及POD),HPA(Horizontal Pod Autoscale)HPA和deployment非常类似,也是管理rs,但控制方式是被cpu等等性能阈值触发
StatefulSet 为解决有状态服务而设计,用于:持久化存储(基于PVC实现)、恒定的网络标识(hostname,podname不变,基于Headless service实现)、有序部署(下一个pod部署之前,必须其它pod都是running或ready状态,也就是一个一个启用,一个启用之后才启用下一个)、有序删除(有序部署的反向操作)
DaemonSet 管理与Node有关的Pod,例如有Node加入群集,则相应的启动一些Pod,如果有Node离开,需要回收Pod。DaemonSet主要用于对Node的管理,对应的Pod则是与群集管理相关的Pod,例如:glusterd,ceph、日志类fluentd、logstash、监控类prometheus Node Exporter
job,cron job,这个没啥说的,就是定时、按规则执行一下;
etcd 可信赖,分布式的键值存储,用于k8s自身数据的持久化,flannel会用etcd来申请和控制跨node网段地址分配,最终提供给pod使用;
kubctl
dashboard 提供图形界面
kubelet 与docker cli交互,创建管理容器
pod相关组件:
- kubelet与容器引擎交互,实现控制命令,完成容器生命周期管理
- kube proxy负责将访问规则写入iptables或ipvs,实现服务映射访问(防火墙管理)
- container,被k8s操纵的具体容器实例(可能多个),在同一pod内的container是隔离的,但共享网络和存储
互联控制:
- api server 所有操作的统一接口,感觉是实现的互联通信功
- CoreDNS 为集群中组件实现DNS访问,同时也是支持负载均衡的重要组件
- IngressController 提供7层代理的功能,如果只用CoreDNS和Nginx,只能完成4层代理,即TCP/IP连接
- Federation提供跨集群的统一管理功能
- Prometheus提供集群监控,超越dashboard的?(感觉dashboard是单一组件,或者是个mini的管理界面)
- ELK提供集群日志统一管理平台
K8S假设所有pod都能直接通信,但具体实现方案:
- 同一pod内,用localhost
- 不同Pod之间,用node overlay netowrk,具体就是采用flannel构造的跨node的虚拟二层网络网桥:再解释一下就是基于物理node网络之上,通过etcd(每个node上运行做管理)完成路由,由flanneld对pod发出的数据包(二层)做封装成UDP数据,路由到对端flanneld,解包回原数据包及原目IP;
- Pod与service之间,用各node的iptables规则(新的好像是LVS)
k8s是对docker进行管理和控制的体系,可以用kubect命令完成,但为了自动化,更多是用资源清单来控制。先看概念:
- 资源级别
namespace,例如缺省安装会生成kube-system,此时用命令kubectl get pod 看不到缺省的管理用pod,缺省get pod 查看的namespace是default。想要查看,需要指定namespace为kube-system: kubectl get pod -n kube-system
– 工作负载型:Pod, ReplicaSet, Deployment, StatefulSet, DaemonSet, Job, CronJob,
– 服务发现及负载均衡型:Service, Ingress
– 配置及存储型:Volume, CSI(container storage interface容器存储接口)
– 特殊类型存储卷:ConfigMap(当配置中心来使用),Secret(用于加密),DownwardAPI(把外部信息传给容器)cluster,例如role,一旦定义,群集内所有地方都能看到
– namespace,Node,Role,ClusterRole,RoleBinding,clusterRoleBindingmetadata,类似cluster,但通过具体指标操作,例如HPA
HPA, PodTemplate,LimitRange
yaml 顺便介绍一下
yaml在这里是用来描述资源的,又被称为资源清单。yaml也是标记语言,但重在数据,标记其次,只是为了识别对应的数据。yaml层次以缩进分隔,只能用空格,但多少无所谓,只要同层对齐。#表示直到行尾都是注释。
yaml支持:
对象可以是键值,mapping,hashes或dictionary
对象键值:
name: harry
age: 50
hash: { name: harry, age: 50 }数组:sequence或者list
animal
- cat
- dog
或者:
animal: [ cat, dog ]
复合结构:
language:
- c
- Python
website:
c: www.gnu.org
Python: www.python.org
- 纯量scalars:单个值,不能再分,例如字符串,布尔值,整数,浮点数,日期,时间,Null (用~表示,或者空着,也是null)
日期和时间都是iso8601格式:
2022-01-26
2022-01-27t14:10:20.15-05:00
YAML可以用!!(两个感叹号)强制转换类型:
mystr: !!str 12345
字符串默认不使用引号,但如果有空格或保留字/符号,则需要用引号(单双都可,但双引号不转义)。如果单引号中使用单引号,则需要两个单引号,前一个用于转义。字符串也可以有多行,但第二行要缩进(好奇怪,不用引号就可以?!)。|号会保留换行(否则将替换为空格),>等于c行尾\,会删掉换行。+会保留字符串末尾换行,-会删除换行。具体效果要自己试一下。
学习套路二,抓取信息,进入圈子;
bilibili的学习视频(质量验证中):
介绍google cloud platform(系列)
https://www.bilibili.com/video/BV1qK41157cu
https://www.bilibili.com/video/BV1Rt4y1r7nu
基础google cloud platform(系列)
https://www.bilibili.com/video/BV1ZV411k72e
https://www.bilibili.com/video/BV1uz411B7w9
https://www.bilibili.com/video/BV1uC4y1p727
还可以,不算非常好,70分吧
docker系列
https://www.bilibili.com/video/BV1gJ411G7ir?p=1
好多乱七八糟的等待,老师经常放音乐,头尾两集插播广告,请自行跳过,总体评价60分
kubernetes系列
https://www.bilibili.com/video/BV1gJ411G7ir?p=1
速度有点慢,结构逻辑有点乱,但还可接受
学习套路三,掌握框架,选择关键线索;
授权管理 Identity and Access Management:who,can do what,on which resource
- who
organize
folder
project
resource
user,service account
can do what
create
edit/change
delete四种操作方式
- console (gui)
- cloud shell,cloud sdk (batch + cmd)
- api (programming)
- cloud console mobile app
- responsibility
- content
- access policies
- usage <— managed service
- deployment
- web application security <— paas
- identity <— iaas
- operations
- access and authentication
- network security
- os, data and content
- audit log
- network
- storage and encryption
- hardware
RDMS:
cloud sql (max 10TB)
cloud spanner (scalability)Non relation:
cloud datastore
cloud bigtableobject unstructured
cloud storagedata warehouse
big query
shell工具:
gsutil
gcloud
学习套路四,动手,熟能生巧;
git
显示配置
git config -l
git config --system -l 系统配置(当前机器所有用户公用,在/etc/gitconfig)
git config --global -l 全局配置(当前用户的全局信息)
设置配置
git config xxxx “xxxxx”
git add -A 保存所有的修改
git add . 保存新的添加和修改,但是不包括删除
git add -u 保存修改和删除,但是不包括新建文件
删除文件后需要 git add -A (删除之后竟然需要add ?!这只是个命令。。。不是真的要add什么,也可以用git add -u)
经常用-A,那就要配.gitignore文件,否则。。。文件内容:
#注释
通配符,例如*,?,[or],{string1, string2}
!针对通配符的例外
/xxx忽略这个目录下的文件,但不包括子目录
xxx/所有xxx目录下的文件,同样不包括再下一级子目录
git commit -m “commit information”
git push --set-upstream origin master 首次push,要设置一下upstream,以后就只需要git push origin master
遇到一个总要用户名密码的,设置一下记下来就好了:
git config --global credential.helper store
git pull origin master 远程同步到本地
git branch 显示分支
git branch -r 远程分支(-r remote)
git branch xxx 新建分支(但现在依然在master)
git checkout -b xxx 新建并切换到xxx分支(基于当前分支)
git checkout -b xxx origin/master新建并切换到xxx分支(基于远程master分支,注:也就是所有origin/都表示远程)
git checkout xxx切换到xxx分支
git branch -d xxx删除分支
git branch -dr xxx删除远程分支
git push origin --delete xxx删除远程分支(与上一命令相同)
git merge xxx将分支xxx与当前分支合并,merge的时候如果有文件冲突(文件不同),会让你选择保留哪个文件
git checkout xxxx 使用hash值checkout可以实现HEAD分离,这个含义是啥呢?基本上等于脱离你的名字而实实在在指到你(不通过名字,而是直接抓你的头发把你揪出来)不知道hash值怎么办?
git log可以显示hash,而且git真的很智能哦,它只需要hash的前几个字符,只要能区别出来hash就可以了(当然,我们知道这是比较编程偷懒的结果,但这个结果很好!)如果还不满足,那还有相对方案,^和~n,前者是向上移动一个记录,后者是移动n个记录。例如:
git branch -f master HEAD^^^ 就是从当前位置强制转到倒退3个提交
git branch -f master HEAD~3 结果与上一条命令相同
后面还有用到^和~,^依然对应着父,但^也可以加数字了,而且可以连用,^加数字用于对应多个父分支(merge之后),^1表示直接继承,^2表示第二个继承分支
branch和checkout的区别好像是branch会创建或者转换当前分支,而checkout会保持分支不变
git reset HEAD^ 回退一个提交(当前修改还在,但处于并未加入到暂存区状态)
git revert HEAD和前者差不多,区别是reset这个没法改远程库。用revert命令则在本地新生成一个commit,而这个commit恰好就是回退一个的那个状态的样子,这样可以同步到远程库。注意当前HEAD在哪,可能需要checkout来控制HEAD
这个算作rebase的快捷版:
git cherry-pick xxx 提交的hash号(可以多个),直接把一堆提交拿到当前branch下生成新提交,换句话说,把别的提交状态拿过来,当成自己的提交状态
如果不知道hash号怎么办?还有interactive的rebase
–interactive或者-i
git rebase -i HEAD~4 对当前倒退4个提交进行调整(生成新分支)
git rebase xxx yyy 类似forward,把yyy跳到xxx(后者链接前者)
git commit --amend 修改最后一次commit(其实是新生成一个commit,然后替换掉刚刚的那个commit)
使用tag,我觉得tag基本与hash id相同,但更好识别一些
git tag t0 xxx xxx是hash
git describe显示最近(倒退)的tag、与之距离几次commit,以及当前hash的综合信息
docker
yun install docker-xxx 安装docker相关的包,有ce (community edition), ee (enterprise edition)等
systemctl start docker启动docker服务
systemctl enable docker开机自动启动docker
docker version检查安装和运行状态(有client和server两部分,server也被称为docker engine)docker ps 类似ps,只看docker的,docker ps -a显示全部信息(包括image名)
docker run
docker run --rm --name hello -p 8080:80 nginx:1.16
–rm 停后删除image
-name 容器名称,可自动生成
-p端口映射 outside或host宿主机:internal或叫guest容器
最后是image的名字,先查本地,如果没有,再查远程(也就是run可以自动下载镜像到本地):1.16是版本号或叫tag(latest表示最新),有版本号会随版本,没有则最新
-u 指定运行用户
-e 设置环境变量
-d daemon模式
-v 设置挂载目录(把host的目录映射给container,格式host_dir:container_dir)
-h 设置hostname
–ip 指定容器ipdocker images查看当前(宿主机)的image
https://hub.docker.com保存有所有docker当前支持的imagedocker search xxxx查找
docker pull xxxx下载到本地
使用container id(docker ps能看到)可以进入到容器目录结构中(其实是执行bash命令,进shell):docker exec -it container_id bash
docker rmi xxx删除image,i是image(如果有基于此image的container instance在运行则无法删除,先要删container:docker rm xxx, xxx为容器id)
docker create --name xxxx -p 8888:80 ngix 创建(但不运行。运行其实可以自动创建)
docker container inspect xxxx查询xxxx的详细状态(json格式,非常多的内容)
docker container logs -f xxxx查看log(-f同tail-f)
通过Dockerfile描述文件控制生成镜像,Dockerfile格式如下:
# VERSION "1.2"
FROM ngix #第一条指令必须是FROM,一个dockerfile可以有多个版本,用FROM分隔
RUN whatever can run as shell command
docker build -t xxxx:1.0 .
如果配置文件名字不是Dockerfile,则要用-f指定名字。注意最后有个点,这个是指定当前目录
Docerfile其它命令:
ADD src dest 将src对应目录文件复制到dest,支持url和压缩包
COPY src dest 同上,不支持url和压缩包
CMD 容器启动后执行的命令,RUN是生成image的时候执行的
EXPOSE 声明对外提供的端口,例如80
WORKDIR 指定容器工作目录
ENV 指定环境变量
ENTRYPOINT 和CMD类似,但不能被RUN覆盖。如果CMD和ENTRYPOINT同时存在,CMD会作为ENTRYPOINT参数
USER 用什么用户执行docker里的程序(docker自身instance属于谁?待确认)
VOLUME 挂载目录
docker会监视cmd运行的程序,如果这个程序挂了,docker instance也就停掉。注意,由于这个原因,cmd一定要设置成前台命令,因为如果命令执行后跑到后台,container启动,执行命令,然后命令结束,然后。。。container也就结束了。。。
docker history xxxx 某个镜像xxxx的执行历史,包括如何生成,如何执行最后累加的命令等等。我理解的是如何从最原始的东西逐步生成当前image,以及运行后的全部过程。每一步骤,就是从上一层镜像到当前镜像的过程,也可以通过dockerfile看到实际的生成指令。history中最后的显示会有存储空间占用大小,标识这条指令操作会导致镜像大小变化(增加)多少。
镜像是只读不可写的,当镜像被启动,生成容器,就会在只读镜像基础之上增加一个可读可写层。当修改某个镜像层文件时,docker会把该文件复制到可写层(diff目录),然后再进行修改。
- dockercompose.yml
这又是docker的一个重要文件和处理过程.dockerfile是控制image内容,而dockercompose.yml则是控制运行过程(也能部分通过命令控制image生成,总之,这个是动态的)。Docker-compose并不是随docker自动提供的,需要自己安装一下,类似一个docker的utilities。安装地址和命令如下:
sudo curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose#改执行权:
sudo chmod 755 /usr/local/bin/docker-compose
#检查一下
docker-compose -v
yml用退格进行层次分段,关键字如下;
version:版本
services:每个docker container提供的服务
xxxx:注意退格,在services下,就表示service名字了
image:再退格,那就是xxxx自身的控制内容,这个image是xxxx需要什么image去构造container
port:端口,可以有多个,所以不知直接跟在后面,而是下一行用"-"标识
- “80:80”
links:这是新的内容,控制谁和谁对接,当然也可以有多个,同样用“-”依次表示,链接的是对方的service名字
- “app”
volumes:
- “./nginx.conf.d/:/etc/nginx/conf.d/” 把host上写好的配置映射到docker container里,由docker nginx启动时使用
app:另一个service,退格与xxxx对齐
image:balabala 以后类似,不写了
类似docker的命令:
docker-compose logs xxxx查看log
docker-compose up -d daemon模式启动(启动时会自动按照yml设置分别启动几个docker container)
kubernetes
安装,yum就是了,要注意关闭swap,关闭selinux,关firewalld,设置iptables(另一种firewall)开启网桥,设置linux内核参数:
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
vm.swappiness=0
net.ipv6.conf.all.disable_ipv6=1
...
安装依赖包:conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget vim net-tools git
根据功能,设置不同的mod,例如kube-proxy则:
modprobe br_netfilter
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
chmod 755 /etc/sysconfig/modules/ipvs.modules
/etc/sysconfig/modules/ipvs.modules
lsmod | grep -e ip_vs -e conntrack
继续安装docker(先设置local repository)
yum install yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum update
yum install docker-ce
创建docker service的option文件。这次docker由于通过kubernetes使用,docker要搞成service模式:
mkdir /etc/docker
cat <<EOF > /etc/docker/daemon.json
{"exec-opts": ["native.cgroupdrive=systemd"],"log-driver": "json-file","log-opts": {"max-size": "100m"}
}
EOF
mkdir -p /etc/systemd/system/docker.service.dsystemctl daemon-reload
systemctl restar docker
systemctl enable docker
安装kubeadm
#配置仓库:
cat << EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOFyum install kubeadm-1.15.1 kubectl-1.15.1 kubelet-1.15.1
systemctl enable kubelet.service#下载docker镜像,使用命令加载(可不执行,但如果没有本地镜像,则需要kubeadm初始化时从公网下载,非常慢且blocked。。。),具体image根据需要提前准备好
docker load -i xxxx#初始化主节点,生成默认模板
kubeadm config print init-defaults > kubeadm-config.yamllocalAPIEndpoint:AdvertiseAddress: 192.168.10.11kubernetesVersion: 1.15.1......
#修改一下模板文件,主要是更改ip,subnet,例如添加podSubnet: "10.244.0.0/16",default是没有的;另一个是添加字段,将调度更改为IPVS:apiVersion: kubeproxy.config.k8s.io/v1alpha1kind: KubeProxyConfigruationfeatureGates:SupportIPVSProxyMode: truemode: ipvs#然后执行:
kubeadm init --config=kubeadm-config.yaml --experiental-upload-certs &
#查看log:
tail -f kubeadm-init.log
注:
由于kubernetes通信都是ssl通信,有大量的密钥使用,保存在/etc/kubernetes/pki子目录,需要时可查看分析。
复制adm模板到运行控制文件(k8s管理员用户自己的根目录):
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown xxx:xxx $HOME/.kube/configkubectl get node
部署flannel:
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
也可以下载下来yml文件后在本地执行:
kubectl create -f kube-flannel.yml
查看一下node, pod的情况:
kubectl get node
kubectl get pod -n kube-system
配置kubernetes的repository(这是一个特殊的docker container)。在配置之前,修改各节点docker的配置文件,添加确认安全的repository地址。由于需要自己设置该服务器及相应的证书,而这个证书由于不能通过public ca认证,所以要强制认定该地址安全):
cat <<EOF > /etc/docker/daemon.json
{"exec-opts": ["native.cgroupdrive=systemd"],"log-driver": "json-file","log-opts": {"max-size": "100m"},"insecure-registries": ["https://hub.xxxx.com"]
}
EOF
systemctl restar docker
配置harbor (repository)服务器:
拿到harbor image,编辑harbor.cfg文件,修改其中:
hostname = hub.xxxx.com
ui_url_protocol = https
ssl_cert = somewhere
ssl_cert_key = somewhere
在somewhere目录创建证书相关文件:
私钥:
openssl genrsa-des3 -out somewhere/server.key 2048
创建证书请求(其中密码与私钥密码对应,域名与hub.xxxx.com对应):
openssl req -new -key somewhere/server.key -out server.csr
将私钥转换成证书(此步的目的是删掉密码。。。汗,docker启动不支持带密码的私钥?):
openssl rsa -in somewhere/server.key -out somewhere/newserver.key
签名:
openssl x509 -req -days 365 -in server.csr -signkey newserver.key -out server.crt
运行harbor安装程序:
./install.sh
检查每个node是否能解析www.xxxx.com
docker ps -a查看harbor是否运行
浏览器http://www.xxxx.com
admin密码登录查看harbor(密码在harbor.cfg配置文件)
docker login https://www.xxxx.com登录,用cli查看
使用docker命令pull一个image到repository:
docker pull xxxxxx:v1
harbor需要特定格式的镜像名才能上载,所以先要改名:
docker tag xxxx:v1 hub.xxxx.com/library/myapp:v1
docker push hub.xxxx.com/library/myapp:v1
测试一下k8s用此镜像,先生成deployment:
kubectl run mydep --image=hub.xxxx.com/library/myapp:v1 --port=80 --replicas=1
查看一下:
kubectl get deployment
kubectl get rs
kubectl get pod
现在只有一个副本,如果想运行多个,可以用命令:
kubectl scale --replicas=3 deployment/mydep
如果想对这个deployment(多个实例)做代理或均衡(通过k8s服务ip),只需要一个命令(容器端口是80,对外端口是3000):
kubectl expose deployment myapp --port=3000 --target-port=80
查看一下服务ip和代理(会多一个service ip):
kubectl get svc
具体查看一下服务:
ipvsadm -Ln
注意,default kubernetes的服务ip是通过cluster ip对外提供服务的,这个cluster ip由于路由设置,只有在kubernetes cluster之内才能访问,如果想把service expose到外面,就要通过node网段才可以,那么就要设置kubernetes使用node网段expose service,更改配置可以实现这个目的:
kubectl edit svc myapp
其中有一项type是ClusterIP,要将其修改为NodePort,那么在每个Node都会产生一个service去监听一个随机的port(生成随机,但运行固定),对应于容易的3000端口,对外提供服务。当然,由于对应于每个Node,就没有service ip一说了,要具体访问每个Node独立IP的对应port。具体使用的时候,需要使用独立于当前k8s cluster外面的负载均衡机制。
下面看看k8s yaml配置Pod资源,必须包含的属性:
apiVersion 目前都是v1
kind 标识资源类型,例如Pod
metadata 元素对象(自己新定义的)
metadata.name 元素对象名
metadata.namespace 作用域命名空间
Spec 详细的对象说明
spec.container[] 包含的容器列表
spec.container[].name 容器的名字
spec.container[].image 使用镜像的名字
其它是可以自己定义,也可以自动赋予省缺值,具体看kubernetes手册或者使用命令:
kubectl explain pod
kubectl explain pod.spec
example: pod.yaml
apiVersion: v1
kind: Pod
metadata:name: myapplabels:app: myappversion: v1
spec:containers: - name: appimage: hub.xxxx.com/library/myapp:v1- name: app2
.....
基于此yaml创建pod:
kubectl apply -f pod.yaml
或kubectl create -f pod.yaml
apply和create的区别是create用于新建,如果已经有,则报错。apply用于新建或更改,如果已经有,则重置使用新参数。
查看运行信息:
kubectl get pod
kubectl get pod -o wide
查看详细信息,包括错误等等:
kubectl describe pod xxxx (xxxx名字可以从get pod拿到)
看单独容器日志(如果只有一个容器则无需指定容器名):
kubectl log xxxx -c app2
Pod中container生命周期控制点(时间点):
Pod启动时可以设置一个(也可以没有)或多个InitContainers(串行执行)容器,用于初始化,如果init失败,则会重复执行,直到成功,除非设置了restartPolicy为Never;Init容器可以包含一些管理工具,由于Init容器生命周期在应用容器之前(InitC最后退出后才会load下一个容器),这样就不会涉及到网络、存储等安全问题(应用容器中如果包含这些工具,容易成为攻击漏洞);InitC完成才会执行下一步,因此可以实现阻塞Main容器的过程,这样可以控制启动顺序。
piVersion: v1
kind: Pod
metadata:name: myapp-pod labels:app: myapp
spec:containers:- name: myapp-container image: busyboxcommand: ['sh', '-c', 'echo The app is running! && sleep 3600'] initContainers:- name: init-myservice image: busyboxcommand: ['sh', '-c', 'until nslookup myservice; do echo waiting for myservice; sleep 2; done;']- name: init-mydb image: busyboxcommand: ['sh', '-c', 'until nslookup mydb; do echo waiting for mydb; sleep 2; done;']#service.yaml
kind: Service
apiVersion: v1
metadata: name: myservice
spec:ports:- protocol: TCPport: 80targetPort: 9376
---
kind: Service
apiVersion: v1
metadata: name: mydb
spec:ports:- protocol: TCPport: 80targetPort: 9377
readiness example:
apiVersion: v1
kind: Pod
metadata:name: readiness-httpget-pod namespace: default
spec:containers:- name: readiness-httpget-container image: myapp:v1 imagePullPolicy: IfNotPresent readinessProbe:httpGet:port: 80path: /index1.html initialDelaySeconds: 1periodSeconds: 3
liveness example:
apiVersion: v1
kind: Pod
metadata:
name: liveness-exec-pod
namespace: default
spec:containers:- name: liveness-exec-containerimage: hub.xxxx.com/library/busybox imagePullPolicy: IfNotPresentcommand: ["/bin/sh","-c","touch /tmp/live ; sleep 60; rm -rf /tmp/live; sleep 3600"]livenessProbe:exec:command: ["test","-e","/tmp/live"] initialDelaySeconds: 1periodSeconds: 3apiVersion: v1
kind: Pod
metadata:name: liveness-httpget-pod namespace: default
spec:containers:- name: liveness-httpget-containerimage: hub.xxxx.com/library/myapp:v1 imagePullPolicy: IfNotPresentports:- name: http containerPort: 80
livenessProbe: httpGet:
port: http
path: /index.html
initialDelaySeconds: 1
periodSeconds: 3
timeoutSeconds: 10apiVersion: v1
kind: Pod
metadata:name: probe-tcp
spec:containers:- name: nginximage: hub.xxxx.com/library/myapp:v1 livenessProbe:initialDelaySeconds: 5timeoutSeconds: 1 tcpSocket:port: 80
启动、退出action example:
apiVersion: v1 kind: Pod metadata:
name: lifecycle-demo spec:
containers:
- name: lifecycle-demo-container image: nginx
lifecycle:
postStart:
exec:command: ["/bin/sh", "-c", "echo Hello from the postStart handler >
/usr/share/message"] preStop:
exec:command: ["/bin/sh", "-c", "echo Hello from the poststop handler >
/usr/share/message"]
删除所有:
kubectl delete deployment --all
kubectl deleet pod --all
kubectl delete service --all
jekins
学习套路五,目标,实践项目;
模拟室验(好像需要翻墙。。。)
https://www.qwiklabs.com/?locale=en
https://oschina.gitee.io/learn-git-branching 强烈推荐
学习套路六,不忘初心,转向不是放弃;
学习套路七,空投斩首式突破、穿插;
devops summary相关推荐
- jira使用教程pdf_需要申请项目?需要开通权限?需要创建流程?刚需教程安排上了!...
关注我,分享给你更多技能 经常有小伙伴问道,申请项目该如何申请?需要某个项目或者空间的权限怎么申请?项目的流程想要IT化自动流转找谁申请?本篇内容依然是手把手教学! 参考这个指南以后碰到这些问题也不会 ...
- AI:《Why is DevOps for Machine Learning so Different?—为什么机器学习的 DevOps 如此不同?》翻译与解读
AI:<Why is DevOps for Machine Learning so Different?-为什么机器学习的 DevOps 如此不同?>翻译与解读 目录 <Why is ...
- 基于 RocketMQ Prometheus Exporter 打造定制化 DevOps 平台
作者 | 陈厚道 冯庆 来源 | 阿里巴巴云原生公众号 导读:本文将对 RocketMQ-Exporter 的设计实现做一个简单的介绍,读者可通过本文了解到 RocketMQ-Exporter 的实 ...
- 从DevOps到AIOps,阿里如何实现智能化运维?
阿里妹导读:AIOps英文全称是Algorithmic IT Operations,是基于算法的IT运维.AIOps是运维领域上的热点,然而在满足业务SLA的前提下,如何提升平台效率和稳定性及降低资源 ...
- 使用Azure DevOps Pipeline实现.Net Core程序的CI
上次介绍了Azure Application Insights,实现了.net core程序的监控功能.这次让我们来看看Azure DevOps Pipeline功能.Azure DevOps Pip ...
- AI赋能DevOps:数据驱动的全栈工程师实践
DevOps是什么? 对于传统的软件研发而言,开发,测试,运维,运营,有不同的岗位进行分工协作,以保证质量和专业度,同一件事情,依赖不同岗位的排期.沟通.协调,效率难免会有打折.而对于互联网业务来说, ...
- DeVOpS 实战:Kubernetes 微服务监控体系
来源 | 无敌码农 责编 | 寇雪芹 头图 | 下载于视觉中国 监控系统是运维体系乃至整个软件产品生命周期中最重要的一环,完善的监控可以帮助我们事前及时发现故障,事后快速追查定位问题. 而在以微服务为 ...
- Devops(二):CentOS7(在线)安装Docker
安装环境: Centos7.5 从 2017 年 3 月开始 docker 在原来的基础上分为两个分支版本: Docker CE 和 Docker EE. 1)Docker CE 即社区免费版 2)D ...
- devops工具-Ansible基础
一.Ansible介绍 简介 Ansible使用Python语言开发,是一个配置管理型工具,与之类似的工具还有Puppet.SaltStack.chef等,默认通过SSH协议进行远程命令执行或下发配置 ...
- 测试意外:DevOps测试中的右移
目录 原链接 翻译内容 Summary(摘要): 正文 A Case for Shifting Right(转移权的案例) Finding New Ways to Test(寻找新的测试方法) Sha ...
最新文章
- Python快速入门,你想要的就在这里了!
- SAP MM 可以不用创建盘点凭证直接录入盘点结果?
- 如何为python程序设置使用次数_提升Python程序性能的7个习惯
- [20171227]表的FULL_HASH_VALUE值的计算2
- c语言单链表_突破C语言难点之单链表?一绘图即可
- 数据库连接字符串 mysql_数据库连接字符串(MySQL,SQL Server,Oracle)
- 软件界面是怎么做出来的_电脑时间管理软件,每天要做的事情会有对话框跳出来提醒的便签软件...
- Linux窗口按钮大小,Fitts: 给Ubuntu窗口一个大按钮
- Eclipse Windows环境配置
- Golang 结构类型
- C#:SQL查询结果生成datatable后,根据min、max查询datatable中min到max的数据,并生成新的datatable
- 茜在人名可以读xi吗_成人高考可以读全日制大学吗?成人高考要去学校上课吗?...
- Android代码中模拟点击事件
- 重命名多个图片文件,并修改图片后缀名
- 从excel表格读取日期利用python简单实现农历转阳历功能(1901-2099年之间)
- PDF文件如何转换成png图片
- SID # 和NID #(系统识别码和网络识别码)
- 【SpringBoot】最通俗易懂的安全管理机制(Spring Security)
- 一份实践性超强的架构部操作手册,拿走不谢!
- Vue中keep-alive原理