k8s等运维(二)
nginx你用到了哪些模块,在proxy模块中你配置过哪些参数?nginx中rewrite有哪几个flag标志位(last、break、redirect、permanent),说一下都什么意思?You need to use nginx from all aspects.iptables: iptables只是linux防火墙的管理工具,真正实现防火墙功能的是netfilter– 内核中实现包过滤
nginx你用到了哪些模块,在proxy模块中你配置过哪些参数?
nginx中rewrite有哪几个flag标志位(last、break、redirect、permanent),说一下都什么意思?
You need to use nginx from all aspects.
iptables: iptables只是linux防火墙的管理工具,真正实现防火墙功能的是netfilter– 内核中实现包过滤的内部结构


如何开启linux服务器路由转发功能?
笔者回答:echo “1” > /proc/sys/net/ipv4/ip_forward
你在shell脚本中用过哪些语法,case语法会用到哪些地方?
笔者回答:一般会用到if语句、for语句、while语句、case语句以及function函数的定义;case语句为多选择语句,可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。最典型的case语法会用到启动服务脚本的处理。
linux系统中你会用到什么命令查看硬件使用状态信息?
笔者回答:这个命令就很多了,比如:lscpu(查看cpu信息)、free -m(查看内存信息)、df -h(查看硬盘分区信息)、top(还可以动态查看cpu、内存使用情况的信息),/proc/目录下也可以查看很多硬件信息。
grep for searching
ps -ef|grep xxxx #search process
grep xxx test.txt -n # 查询并现实行数
grep xxx test.txt -c # count the number of keyword occurrences
sed主要是增删改文本文件
他们俩干不了的用awk,(简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理)
比如开发想找你查看tomcat日志,但是catalia.out特别大,你不可能用vi打开去看,你会怎么查看?如果你用 grep -i"error" 过滤只是包含error的行,我想同时过滤error上面和下面的行如何实现?
笔者回答:grep -i “error” catalia.out
grep -C 1 -i “error” catalia.out
参数-C:是匹配前后的行,后面1是匹配前后各1行
Crontab可以用来在系统中定期的执行任务。比如:写了一个爬虫需要每天早上八点执行,就可以用到Crontab;安装的Tomcat服务器需要每天凌晨重启一次,也可以使用到Crontab。总之,几乎所有的定时任务,我们都可以通过Crontab这个工具来完成。
在命令行输入: crontab -e 然后添加相应的任务,wq存盘退出
-e编辑某个用户的任务
怎么编写一个定时计划任务?里面用到的最小单位是什么?
笔者回答:crontab -e,the minimum unit is minutes
zabbix没有实操过,我是不懂的
zabbix如何修改其中监控的一台服务器中内存阈值信息,比如正常内存使用到了80%报警,我想修改为60%报警?
笔者回答:正常来说,一般会把监控的服务器统一加入到一个模板中,修改模板的其是某一项的监控项参数和告警阈值后,加入模板中的所有主机都会同步。如果单独想修改其中某一台服务器内存告警阈值,需要进入这台主机,单独创建一个告警Triggers,关联这台主机监控内存的项,配置好告警的阈值为60%即可实现。其实,zabbix一切都为图形化操作,如果没有接触过zabbix的朋友,可能听起来不太清楚。
What is the most profound problem you have encountered in your work? And how did you solve it?
在linux系统中,一般都会有swap内存,你觉得使用swap内存有什么好处,在什么情况下swap内存才会被使用?你觉得在生产环境中要不要用swap内存?
笔者回答:好处:在内存不够用的时候,将部分内存上的数据交换到swap空间上,以便让系统不会因为内存不够用而导致oom或者更致命的情况出现。
什么情况下会用swap:当系统的物理内存不够用的时候,就需要将物理内存中的一部分空间释放出来,以供当前运行的程序使用。那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存到swap空间中,等到那些程序要运行时,再从swap中恢复保存的数据到内存中。这样,系统总是在物理内存不够时,才进行swap交换。
How to check whether the network between two servers is normal?服务器是禁ping的
笔者回答:不能用ping,那可以用telnet对方服务器的端口、或者互相访问对方打开的服务。
For example, is there any way for me to visit Baidu to track which network nodes I have passed?
tracert ip/domain
if the access to your company’s website is slow,how will you troubleshoot?
问清楚反应的人哪个服务应用或者页面调取哪个接口慢,叫他把页面或相关的URL发给你,首先,最直观的分析就是用浏览器按F12,看下是哪一块的内容过慢(DNS解析、网络加载、大图片、还是某个文件内容等),如果有,就对症下药去解决(图片慢就优化图片、网络慢就查看内网情况等)。其次,看后端服务的日志,其实大多数的问题看相关日志是最有效分析,最好用tail -f 跟踪一下日志,当然你也要点击测试来访问接口日志才会打出来。最后,排除sql,,找到sql去mysql执行一下,看看时间是否很久,如果很久,就要优化SQL问题了,expain一下SQL看看索引情况啥的,针对性优化。数据量太大的能分表就分表,能分库就分库。如果SQL没啥问题,那可能就是写的逻辑代码的问题了,一行行审代码,找到耗时的地方改造,优化逻辑。
I need to check the log for a certain period of time, how to implement it?
比如我要看查的时间是2018年1月9号–1月10号的日志吧。
比如可以用sed命令,格式为:sed -n ‘/起始时间/,/结束时间/p’ 日志文件,如下:
sed -n ‘/09/Jan/2018/,/10/Jan/2018/p’ access.log
比如可以用grep,格式为:grep -E ‘起始时间|结束时间’ 日志文件,如下:
grep -E ‘09/Jan/2018|10/Jan/2018’ access.log
The following all need to watch video to learn
Mysql 锁,主从库看一看
redis集群原理说一下,正常情况下mysql有多个库,redis也有多个库,我怎么进入redis集群中的第2个库?还有,我想查看以BOSS开头的值?redis持久化是如何实现(一种是RDS、一种是AOF),说一下他们有啥不一样?
Online class
1、认证 授权
认证类似学位证
网络安全就是防止两个服务通信的时候,信息在中间被截获,类似中学时期传纸条
对称加密: msg–>对称加密(密钥)–>乱码密文–> 对称解密(密钥)–> 得到msg
非对称加密: msg–>非对称加密(公钥)–>乱码密文–> 非对称解密(私钥)–> 得到msg 缺点性能消耗太大,对称加密性能佳
非对称加密更安全,因为密钥不能传给别人,中间被截获就完了,而私钥不需要传给他人
结合二者,用公钥加密密钥钥,非对称传过去密钥,然后用对称加密传递msg—这就是SSL/TLS,但这样还是有风险,用CA(证书认证机构,给所有人颁发证书的中间机构,里面存储的大量信息,网址,所有人等等,它根据这些信息作为一个判官)解决
这样当service A 得到 B的公钥的时候,先找CA判断公钥是不是合法的,是不是B的公钥,防止黑客从中间修改公钥
如果https如果是红色,那说明证书不是ca认证过的,是自己生成的
2、k8s的认证
1)客户端证书认证(TLS双向认证)— kubectl 与 ApiServer 通信使用的认证,就是互相判断对方是否合法
k8s用的CA是自己搞的CA,不是那个共有的CA,给每个组件颁发证书,比如ctcd,kubectl ApiServer等等
2)BearerToken
就是ApiServer将密码(bearerToken)发给kubectl,每次kubectl和 ApiServer通信的时候,带上那串密码
3) ServiceAccount (包含了三个内容 namespace,token,ca)
前两种是用于与外部验证,而这个是内部pod与 ApiServer打交道的时候用到的
3、授权
认证是访问 Apiserver的第一关,授权是第二关
认证是认证你的身份没问题。授权就是这个身份的人有权干什么
User 用户—Role 角色—Authority 职权
user层面上分为两种,User(客户端 kubectl等外部)和 ServiceAccount(集群内部访问ApiServer)
Authority 分为两种,一种Resource 资源的维度,能访问什么资源,比如deployment,service。
还有一种是对资源的控制方式,增删改查
Role 具有什么name, 有哪些权限,能增删改查什么
用户是什么角色,k8s没有数据库记录这些,它是用RoleBinding
Role在namespace下面,拥有角色也只是在当前命名空间下行使权力
超越namespace 用 ClusterRole,对应 ClusterRoleBinding, 比如node这种资源不属于任何namespace,我们就用ClusterRole操作它
4、第三关 Admission Control 准入控制,一个个的小插件,独立存在,并没有什么联系
当请求通过了前面的认证和授权之后,还需要经过准入控制处理通过之后,apiserver 才会处理这个请求。Admission Control 有一个准入控制列表,我们可以通过命令行设置选择执行哪几个准入控制器。只有所有的准入控制器都检查通过之后,apiserver 才执行该请求,否则返回拒绝。
比如 AlwaysAdmit,总是允许所有的请求通过,AlwaysDeny 总是拒绝,
5、概念
calio 网络插件
kubectl create -f xx.yml #就能创建一个pod
#看看有哪些服务在运行
kubectl get svc
6、private warehouse– vmware的Harbor
简单好用架构
在两个worker节点上做Harbor-A 和Harbor-B,在master节点部署nginx,实现负载均衡
两台worker上,download tar.gz
解压,修改配置文件 harbor.cfg 将hostname改成本机ip
vi docker-compose.yml 将数据库和存储镜像的位置改到本地容量最大的地方,做一个软连接
然后 sh install.sh
Harbor 配一下自己仓库的域名,docker 里面也要加进去域名 网页就是建一个自己的仓库,建用户。然后docker login,就能push
服务之间的通信
1、集群内服务间通信
1.1 DNS + clusterIP
用pod IP能访问,但pod ip 总变化,所以不好。
Service 有一个clusterIP,Service 可以指向多个pod。通过这个serviceIP通信,它相对稳定。使用dns通过service的名字访问到service
1.2 Headless Service
客户端想要和指定的的Pod直接通信, 并不是随机选择
开发人员希望自己控制负载均衡的策略,不使用Service提供的默认的负载均衡的功能
应用场景:
例如主节点可以对数据库进行读写操作,而其它的两个工作节点只能读,在这里客户端就没必要指定pod服务的集群地址,直接指定数据库Pod ip地址即可,这里需要绑定dns,客户端访问dns,dns会自动返回pod IP地址列表
2、内部访问集群外部
2.1 外部服务绑定ip和port
2.2 pod 访问DNS–>servie—>Endpoint(里面是外部服务的ip和端口),这样就不需要修改pod即使外部服务ip变化
2.3 集群外部访问内部服务。
1)用hostport,就是只在有需访问服务那台机器上开放端口,比如8080
2)Browser—>nginx(通过修改nginx.config 里面包含podIP啥的,但是老变,频繁修改配置文件不好,于是出现了ingress)
Ingress用于从集群外部到集群内部Service的HTTP和HTTPS路由,流量从Internet到Ingress再到Services最后到Pod上,通常情况下,Ingress部署在所有的Node节点上。但Ingress不会暴露任意端口或协议
ingress由两部分组成:
A.ingress controller:将新加入的Ingress转化成Nginx的配置文件并使之生效
B.ingress服务:将Nginx的配置抽象成一个Ingress对象,每添加一个新的服务只需写一个新的Ingress的yaml文件即可
部署ingress-nginx
Internet 要访问集群内部的Service–>pod,会被edge router drop掉或者转发到别的地方。用ingress打通internet与 service 之间的通道
下载yml文件,然后kubectl apply -f xx.yaml 就安上ingress-nginx了, kubectl get all -n ingress-nginx
给节点打标签,然后修改yaml deployment 里面的 nodeSelector: 这里写上标签,hostNetwork:true【kubernetes “hostNetwork: true”,这是一种直接定义Pod网络的方式。如果在POD中
使用"hostNetwork: true"配置网络,pod中运行的应用程序可以直接看到宿主主机的网
络接口,宿主机所在的局域网上所有网络接口都可以访问到该应用程序及端口。】
demo.yaml 里面包含deployment service ingress(里面包含域名和端口); kubectl create -f demo.yaml 就能创建一个pod
kubectl create命令,是先删除所有现有的东西,重新根据yaml文件生成新的。所以要求yaml文件中的配置必须是完整的
kubectl apply命令,根据配置文件里面列出来的内容,升级现有的。所以yaml文件的内容可以只写需要升级的属性
journalctl -f 查看yaml下载镜像过程
更多推荐




所有评论(0)