每日一问文案

数据库

MySQL

  1. MySQL 集群如何实现数据库同步?

MySQL 实现数据库同步的方法是 slave端从 master端获取binlog日志,然后再在按照顺序的执行该日志中所记录的各种SQL操作。MySQL 复制主要有三种方式,异步复制,全同步复制和半同步复制,异步复制就是事务提交后直接返回,半同步复制是在第一次 relay log 后返回。

  1. 为什么要分 kernel mode 和 user mode?

在许多电脑的硬件架构中,为了不让程序任意存取任何资源(例如随机存取存储器RAM),大部分的CPU架构都支持Kernel mode与User mode两种执行模式,当然这种模式也得要OS有相关实际配合才有作用,像DOS就没有 Kernel/User mode的分别,所有以DOS执行的程序都可对任意资源执行任何行为,所以DOS上的病毒才能那么嚣张,动不动就格式化硬盘。

内核态: CPU可以访问内存所有数据, 包括外围设备, 例如硬盘, 网卡. CPU也可以将自己从一个程序切换到另一个程序
用户态: 只能受限的访问内存, 且不允许访问外围设备. 占用CPU的能力被剥夺, CPU资源可以被其他程序获取

所有用户程序都是运行在用户态的, 但是有时候程序确实需要做一些内核态的事情, 例如从硬盘读取数据, 或者从键盘获取输入等. 而唯一可以做这些事情的就是操作系统, 所以此时程序就需要向操作系统请求以程序的名义来执行这些操作.

这时需要一个这样的机制: 用户态程序切换到内核态, 但是不能控制在内核态中执行的指令

这种机制叫系统调用, 在CPU中的实现称之为陷阱指令(Trap Instruction)

他们的工作流程如下:

用户态程序将一些数据值放在寄存器中, 或者使用参数创建一个堆栈(stack frame), 以此表明需要操作系统提供的服务.
用户态程序执行陷阱指令
CPU切换到内核态, 并跳到位于内存指定位置的指令, 这些指令是操作系统的一部分, 他们具有内存保护, 不可被用户态程序访问
这些指令称之为陷阱(trap)或者系统调用处理器(system call handler). 他们会读取程序放入内存的数据参数, 并执行程序请求的服务
系统调用完成后, 操作系统会重置CPU为用户态并返回系统调用的结果

容器

1、docker容器 –pid=host 有什么作用?
docker默认情况下容器中的PID对主机是不可见的,而通过 --pid=host可以让容器pid在主机中可见。

2、docker 容器网络模型?
docker network ls查看,比如:

docker network ls
NETWORK ID NAME DRIVER SCOPE
4d4f207cbe59 bridge bridge local
e694355b62f7 host host local
8ef5d2ab8289 none null local

3、容器镜像启动运行不退出的一个简单解决方案
Dockerfile

CMD ["tail", "-f", "/dev/null"]

k8s

  1. 如何快速创建一个 deployment 模板文件?

使用dry-run参数

kubectl create deployment <deployment-name> --images=<images-name> --dry-run=client --output=yaml

  1. go build 和 go build main.go 有什么区别?

两者的作用空间不同,一个是编译一个文件,一个是编译包,在 go.mod 模式下,编译包的时候会找到包目录

  1. 在使用istio的时候, k8s的service端口名字为什么需要带协议名称?

此处是isito初学者常见的坑,这里官方文档有提及:https://istio.io/latest/zh/docs/ops/deployment/requirements/
k8s中使用istio,pod 和 service 需要遵守以下准则:

  • Service 的端口必须命名。端口名键值对必须按以下格式:name: [-],比如grpc-0。协议可以被自动检测或者明确的声明确定。
  • 每个 Pod 必须至少属于一个 Kubernetes Service,不管这个 Pod 是否对外暴露端口。
  • 如果一个 Pod 同时属于多个 Kubernetes Service, 那么这些 Service 不能同时在一个端口号上使用不同的协议(比如:HTTP 和 TCP)
  • deployment需带有 app 和 version 标签,app 标签用于在分布式追踪中添加上下文信息,version 标签用于在特定方式部署的应用中表示版本。
  • istio 网格中的 Pod 不会以用户 ID(UID)为 1337 的用户运行应用。

运维

  1. base64命令使用加密解密前后不一致问题?

有一个base64的加密的字符串,解密为:

$ echo "Y24tbm9ydGgtNEBDUE1KMTBBUlNBOEJGUTZQS0xHTzpiMzMwMGVkNmM0NGM0ZjIyNmM1YjY0MzljYWU3OGNhM2NjZmI1NGUxOWQ1ZDQ1YTE3ZjNlNGMzY2M3YzY0YzE2" | base64 -d
cn-north-4@CPMJ10ARSA8BFQ6PKLGO:b3300ed6c44c4f226c5b6439cae78ca3ccfb54e19d5d45a17f3e4c3cc7c64c16

但拿来进行加密会发现多了一个“Cg==”:

$ echo "cn-north-4@CPMJ10ARSA8BFQ6PKLGO:b3300ed6c44c4f226c5b6439cae78ca3ccfb54e19d5d45a17f3e4c3cc7c64c16" | base64
Y24tbm9ydGgtNEBDUE1KMTBBUlNBOEJGUTZQS0xHTzpiMzMwMGVkNmM0NGM0ZjIyNmM1YjY0Mzlj
YWU3OGNhM2NjZmI1NGUxOWQ1ZDQ1YTE3ZjNlNGMzY2M3YzY0YzE2Cg==

其实这个 Cg== 是一个换行符,也就是新行结尾字符”/r”,所以会出现不一致现象

  1. k8s集群中如何让 pod 和宿主机的时间同步?

最简单的方法是直接将host主机的/etc/localtime挂载:

apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-test
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- name: vol-localtime
readOnly: true
mountPath: /etc/localtime
volumes:
- name: vol-localtime
hostPath:
path: /etc/localtime
type: ""

  1. 如何为单独的 pod 设置 dns服务器或者hosts?

(1)使用 HostAliases 向 Pod /etc/hosts 文件添加条目

apiVersion: v1
kind: Pod
metadata:
name: hostaliases-pod
namespace: default
spec:
restartPolicy: Never
hostAliases:
- ip: "127.0.0.1"
hostnames:
- "foo.local"
- "bar.local"
- ip: "10.1.2.3"
hostnames:
- "foo.remote"
- "bar.remote"
containers:
- name: cat-hosts
image: busybox
command:
- cat
args:
- "/etc/hosts"

查看容器返回:

$ kubectl logs -f -ndefault hostaliases-pod
# Kubernetes-managed hosts file.
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
fe00::0 ip6-mcastprefix
fe00::1 ip6-allnodes
fe00::2 ip6-allrouters
10.0.2.167 hostaliases-pod

# Entries added by HostAliases.
127.0.0.1 foo.local bar.local
10.1.2.3 foo.remote bar.remote

(2)通过设置 dnsConfig 配置 pod 的 DNS 策略,修改容器的/etc/resolv.conf文件

apiVersion: v1
kind: Pod
metadata:
namespace: default
name: pod-dnsconfig-example
spec:
restartPolicy: Never
containers:
- name: cat-hosts
image: busybox
command:
- cat
args:
- "/etc/resolv.conf"
dnsPolicy: "None"
dnsConfig:
nameservers:
- 1.2.3.4
searches:
- ns1.svc.cluster-domain.example
- my.dns.search.suffix
options:
- name: ndots
value: "2"
- name: edns0

查看容器:

$ kubectl logs -f -ndefault pod-dnsconfig-example
nameserver 1.2.3.4
search ns1.svc.cluster-domain.example my.dns.search.suffix
options ndots:2 edns0 single-request-reopen timeout:2

shikanon wechat
欢迎您扫一扫,订阅我滴↑↑↑的微信公众号!