最后更新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
  1. compute engine
  2. kubernetes engine
  3. app engine
  4. could foundation
  • storage
  1. bigtable
  2. cloud storage
  3. cloud sql
  4. cloud spanner
  5. cloud datastore
  • big data
  1. big query
  2. pub/sub
  3. data flow
  4. data proc
  5. data lab
  • machine learning
  1. natural language api
  2. vision api
  3. machine learning
  4. speech api
  5. translate api

此外还有一个辅助系统:

  • budgets and billing
  1. budgets and alert
  2. billing
  3. export
  4. 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命令完成,但为了自动化,更多是用资源清单来控制。先看概念:

  • 资源级别
  1. 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(把外部信息传给容器)

  2. cluster,例如role,一旦定义,群集内所有地方都能看到
    – namespace,Node,Role,ClusterRole,RoleBinding,clusterRoleBinding

  3. metadata,类似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

  • 四种操作方式

  1. console (gui)
  2. cloud shell,cloud sdk (batch + cmd)
  3. api (programming)
  4. cloud console mobile app
  • responsibility
  1. content
  2. access policies
  3. usage <— managed service
  4. deployment
  5. web application security <— paas
  6. identity <— iaas
  7. operations
  8. access and authentication
  9. network security
  10. os, data and content
  11. audit log
  12. network
  13. storage and encryption
  14. hardware
  • RDMS:
    cloud sql (max 10TB)
    cloud spanner (scalability)

  • Non relation:
    cloud datastore
    cloud bigtable

  • object unstructured
    cloud storage

  • data 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 指定容器ip

  • docker images查看当前(宿主机)的image
    https://hub.docker.com保存有所有docker当前支持的image

  • docker 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相关推荐

  1. jira使用教程pdf_需要申请项目?需要开通权限?需要创建流程?刚需教程安排上了!...

    关注我,分享给你更多技能 经常有小伙伴问道,申请项目该如何申请?需要某个项目或者空间的权限怎么申请?项目的流程想要IT化自动流转找谁申请?本篇内容依然是手把手教学! 参考这个指南以后碰到这些问题也不会 ...

  2. AI:《Why is DevOps for Machine Learning so Different?—为什么机器学习的 DevOps 如此不同?》翻译与解读

    AI:<Why is DevOps for Machine Learning so Different?-为什么机器学习的 DevOps 如此不同?>翻译与解读 目录 <Why is ...

  3. 基于 RocketMQ Prometheus Exporter 打造定制化 DevOps 平台

    作者 | 陈厚道  冯庆 来源 | 阿里巴巴云原生公众号 导读:本文将对 RocketMQ-Exporter 的设计实现做一个简单的介绍,读者可通过本文了解到 RocketMQ-Exporter 的实 ...

  4. 从DevOps到AIOps,阿里如何实现智能化运维?

    阿里妹导读:AIOps英文全称是Algorithmic IT Operations,是基于算法的IT运维.AIOps是运维领域上的热点,然而在满足业务SLA的前提下,如何提升平台效率和稳定性及降低资源 ...

  5. 使用Azure DevOps Pipeline实现.Net Core程序的CI

    上次介绍了Azure Application Insights,实现了.net core程序的监控功能.这次让我们来看看Azure DevOps Pipeline功能.Azure DevOps Pip ...

  6. AI赋能DevOps:数据驱动的全栈工程师实践

    DevOps是什么? 对于传统的软件研发而言,开发,测试,运维,运营,有不同的岗位进行分工协作,以保证质量和专业度,同一件事情,依赖不同岗位的排期.沟通.协调,效率难免会有打折.而对于互联网业务来说, ...

  7. DeVOpS 实战:Kubernetes 微服务监控体系

    来源 | 无敌码农 责编 | 寇雪芹 头图 | 下载于视觉中国 监控系统是运维体系乃至整个软件产品生命周期中最重要的一环,完善的监控可以帮助我们事前及时发现故障,事后快速追查定位问题. 而在以微服务为 ...

  8. Devops(二):CentOS7(在线)安装Docker

    安装环境: Centos7.5 从 2017 年 3 月开始 docker 在原来的基础上分为两个分支版本: Docker CE 和 Docker EE. 1)Docker CE 即社区免费版 2)D ...

  9. devops工具-Ansible基础

    一.Ansible介绍 简介 Ansible使用Python语言开发,是一个配置管理型工具,与之类似的工具还有Puppet.SaltStack.chef等,默认通过SSH协议进行远程命令执行或下发配置 ...

  10. 测试意外:DevOps测试中的右移

    目录 原链接 翻译内容 Summary(摘要): 正文 A Case for Shifting Right(转移权的案例) Finding New Ways to Test(寻找新的测试方法) Sha ...

最新文章

  1. Python快速入门,你想要的就在这里了!
  2. SAP MM 可以不用创建盘点凭证直接录入盘点结果?
  3. 如何为python程序设置使用次数_提升Python程序性能的7个习惯
  4. [20171227]表的FULL_HASH_VALUE值的计算2
  5. c语言单链表_突破C语言难点之单链表?一绘图即可
  6. 数据库连接字符串 mysql_数据库连接字符串(MySQL,SQL Server,Oracle)
  7. 软件界面是怎么做出来的_电脑时间管理软件,每天要做的事情会有对话框跳出来提醒的便签软件...
  8. Linux窗口按钮大小,Fitts: 给Ubuntu窗口一个大按钮
  9. Eclipse Windows环境配置
  10. Golang 结构类型
  11. C#:SQL查询结果生成datatable后,根据min、max查询datatable中min到max的数据,并生成新的datatable
  12. 茜在人名可以读xi吗_成人高考可以读全日制大学吗?成人高考要去学校上课吗?...
  13. Android代码中模拟点击事件
  14. 重命名多个图片文件,并修改图片后缀名
  15. 从excel表格读取日期利用python简单实现农历转阳历功能(1901-2099年之间)
  16. PDF文件如何转换成png图片
  17. SID # 和NID #(系统识别码和网络识别码)
  18. 【SpringBoot】最通俗易懂的安全管理机制(Spring Security)
  19. 一份实践性超强的架构部操作手册,拿走不谢!
  20. Vue中keep-alive原理

热门文章

  1. BZOJ---4484:[Jsoi2015]最小表示【bitset】
  2. Java第十二周作业
  3. 云模型的MATLAB实现
  4. 【交互设计师必备书单】资深交互设计师推荐的交互设计师必看的七本书
  5. C# 上传本地文件到远程共享文件夹,从远程共享文件夹下载文件到本地
  6. 网站开发之HTML基础知识及超链接(二)
  7. 程序员实习期馒头加酸菜,转正后月薪10K起步:走路都带风!
  8. 赵征出任尚德机构独立董事 替代俞敏洪席位
  9. [转]多普达818、828+升级中文WM6.1及必装软件全过程讲解
  10. 周末北戴河游玩-北京游客