caitiao的博客

就现在,Just do it

0%

光猫密码忘记了,想找到局域网内一台电脑的ip地址,就想着用工具去扫描出网络内活跃的主机。

  1. 安装nmap
    1
    brew install nmap
  2. 探测网络中活跃的主机
    1
    2
    # 扫描此网段有多少ip在线,探测网段中的全部主机
    nmap -v -sP 192.168.1.0/24
  3. 探测主机系统版本
    nmap -O IP:探测指定IP的相关数据
    1
    nmap -O 192.168.1.3
  4. 全面扫描
    nmap -A IP:扫描指定IP的全部内容
    1
    nmap -A 192.168.1.3

拿到mac电脑后,第一件事一般都会需要配置一个适合自己用的终端。我一般选择iterm2作为日常工作的终端,下面我就来记录下怎么配置我的iterm2。

  1. 安装iterm2
    1
    brew install iterm2
  2. oh-my-zsh
    我电脑默认的sh是zsh,有了oh-my-zsh配置zsh就事半功倍。
  • 检查当前系统支持的shell
    1
    cat /etc/shells
  • 将当前默认shell设置为zsh
    1
    chsh -s /bin/zsh
  • 安装oh-my-zsh
    1
    sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
  1. 配置zsh主题

    1
    2
    3
    vim ~/.zshrc
    找到ZSH_THEME配置你想配置的主题,你可以在https://github.com/ohmyzsh/ohmyzsh/wiki/Themes 找到自己想要的主题
    我的配置:ZSH_THEME="agnoster"
  2. 字体配置
    下载特定字体,以避免无法解码

    1
    2
    3
    4
    5
    6
    # clone
    git clone https://github.com/powerline/fonts.git --depth=1
    # install
    ./fonts/install.sh
    # 清楚当前字体目录
    rm -rf fonts

    打开iterm2首选项,配置文件->文件->字体,选择“Meslo LG M for Powerline”字体,如果这一步不设置,可能会出现乱码

  3. 安装推荐的插件

  • 语法高亮插件(syntax-highlighting)
    1
    2
    3
    git clone https://github.com/zsh-users/zsh-syntax-highlighting.git $ZSH_CUSTOM/plugins/zsh-syntax-highlighting
    vim ~/.zshrc
    plugins=(zsh-syntax-highlighting)
  • 自动补全插件(autocomplete)
    1
    2
    3
    git clone https://github.com/zsh-users/zsh-autosuggestions ~/.oh-my-zsh/custom/plugins/zsh-autosuggestions
    vim ~/.zshrc
    plugins=(zsh-syntax-highlighting zsh-autosuggestions)
  1. iTerm2隐藏用户名和主机名
    通常在Shell中默认的用户名和主机名加在一起会很长,使用的时候影响观感,我们可以通过配置去除掉
    1
    2
    3
    4
    5
    vim ~/.zshrc
    # 新增DEFAULT_USER="xxxxx"配置
    DEFAULT_USER="xxxxx" #xxxxx是当前用户名,可以通过whoami获得
    # 退出并保存后,使配置生效
    source ~/.zshrc

通过创建一个 Kubernetes Deployment 并使用 PersistentVolumeClaim 将其连接到已有的 PersistentVolume 来运行一个有状态的应用

  1. 创建一个MySQL数据存储卷的PersistentVolume,mysql-pv.yaml
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    apiVersion: v1
    kind: PersistentVolume
    metadata:
    name: mysql-pv-volume
    labels:
    type: local
    spec:
    storageClassName: manual
    capacity:
    storage: 20Gi
    accessModes:
    - ReadWriteOnce
    hostPath:
    path: "/mnt/data"
    ---
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
    name: mysql-pv-claim
    spec:
    storageClassName: manual
    accessModes:
    - ReadWriteOnce
    resources:
    requests:
    storage: 20Gi
  2. 执行PersistentVolume创建
    1
    kubectl apply -f mysql-pv.yaml
  3. 查看新建的PersistentVolumeClaim
    1
    kubectl describe pvc mysql-pv-claim
  4. 创建一个MySQL Deployment,mysql-deployment.yaml
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    apiVersion: v1
    kind: Service
    metadata:
    name: mysql
    spec:
    ports:
    - port: 3306
    selector:
    app: mysql
    clusterIP: None
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: mysql
    spec:
    selector:
    matchLabels:
    app: mysql
    strategy:
    type: Recreate
    template:
    metadata:
    labels:
    app: mysql
    spec:
    containers:
    - image: mysql:5.6
    name: mysql
    env:
    # 在实际中使用 secret
    - name: MYSQL_ROOT_PASSWORD
    value: password
    ports:
    - containerPort: 3306
    name: mysql
    volumeMounts:
    - name: mysql-persistent-storage
    mountPath: /var/lib/mysql
    volumes:
    - name: mysql-persistent-storage
    persistentVolumeClaim:
    claimName: mysql-pv-claim
  5. 检查创建的应用是否成功
    1
    2
    3
    kubectl describe deployment mysql-deployment #显示Deployment信息
    kubectl get pods -l app=mysql-deployment #查看Pod列表
    kubectl decribe pod <pod-name> #查看Pod信息

  1. 创建一个YAML配置文件 nginx-deployment.yaml
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: nginx-deployment
    spec:
    selector:
    matchLabels:
    app: nginx
    replicas: 2 # 告知 Deployment 运行 2 个与该模板匹配的 Pod
    template:
    metadata:
    labels:
    app: nginx
    spec:
    containers:
    - name: nginx
    image: nginx:1.14.2
    ports:
    - containerPort: 80
  2. 提交Deployment配置到k8s集群
    1
    kubectl apply -f nginx-deployment.yaml
  3. 检查创建的应用是否成功
    1
    2
    3
    kubectl describe deployment nginx-deployment #显示Deployment信息
    kubectl get pods -l app=nginx #查看Pod列表
    kubectl decribe pod <pod-name> #查看Pod信息
  4. 升级nginx版本1.14.2->1.16.1,创建nginx-deployment-update.yaml
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: nginx-deployment
    spec:
    selector:
    matchLabels:
    app: nginx
    replicas: 2
    template:
    metadata:
    labels:
    app: nginx
    spec:
    containers:
    - name: nginx
    image: nginx:1.16.1 # 将 nginx 版本从 1.14.2 更新为 1.16.1
    ports:
    - containerPort: 80
  5. 执行nginx更新
    1
    kubectl apply -f nginx-deployment-update.yaml
  6. 通过增加副本数来扩容应用,创建nginx-deployment-scale.yaml
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: nginx-deployment
    spec:
    selector:
    matchLabels:
    app: nginx
    replicas: 4 # 将副本数从 2 更新为 4
    template:
    metadata:
    labels:
    app: nginx
    spec:
    containers:
    - name: nginx
    image: nginx:1.16.1
    ports:
    - containerPort: 80
  7. 执行扩容动作
    1
    kubectl apply -f nginx-deployment-scale.yaml
  8. 检查创建的应用是否扩容成功
    1
    kubectl get pods -l app=nginx #查看Pod列表,2->4

Workloads(工作负载):

运行在k8s上的应用,可是单独一个组件(比如:job),也可以是多个组件协同运行(比如:deployment,service,ingress等一起构成一个应用)

Pod:

k8s应用的最基本执行单元,在创建或部署k8s对象模式的最小和最简单单元,相当于集群中运行的进程。Pod是一组容器的集合,每个Pod可以由一个或多个容器组成,每个Pod由k8s分配一个集群内的IP和DNS。同一个Pod中的多个容器共享Pod的存储和网络,且总是被安排在相同的node上,且同时启动或停止。两种主要使用方法

  • 运行一个单一容器的Pod
  • 运行多个需要共同运行的多个容器的Pod

init容器:

init容器在其它容器运行之前启动运行并终止,init容器可以做一些初始化的工作。

Workloads Resources(工作负载资源):

用于管理Pods,通过将相同Pods组合成一个Workload,简化一组Pods的管理,预置的Workloads Resources如下

  • Deployment:Deployment适合管理集群上的无状态应用,在Deployment汇总所有pod完全等价,且在需要时随时可被替换。
  • ReplicaSet:维护一组在任何时候都处于运行状态的Pod副本的稳定集合,通常用来保证给定的数量,完全相同的Pod的可用性。
  • StatefulSet:运行一个或多个需要跟踪应用状态的Pods,管理基于相同容器规约的一组Pod,每个Pod维护一个有粘性永久不变的ID。例如,数据需要持久化的Pod就可以使用StatefulSet,将每个Pod和某个k8s持久化存储卷对应起来(即共享存储),StatefulSet的各个Pod可以通过共享k8s持久化存储卷交换数据提高整体服务可靠性,相当于共享Nas的Web服务器。
  • Job:创建一个或多个Pod,并持续重复Pod的执行,直到指定数量的Pod成功终止。定义Job可以确保一组Pod围绕一个任务来反复执行直到最终目标达成后Job终止。
  • CronJob:创建基于时隔重复调度的Job,用于执行排期操作,如备份,生成报告等。
  • DaemonSet:适合为Cluster Node提供服务的Pod,比如管理集群网络或插件,当在k8s集群中新增Node时,由Control Plane根据DaemonSet中的定义安排在新的Node上运行Pod
  • ReplicationController:确保一个Pod或一组同类的Pod总是可用

Service:

将运行在一个或一组 Pod 上的网络应用程序公开为网络服务的方法。用来把应用运行的Pods作为网络服务暴露出来,Pods没有固定IP,Service有固定IP

Namespace:

k8s在cluster中创建的virtual cluster

DNS:

特指k8s内部的DNS,k8s会自动为每个Pod和Service创建DNS,暴露出Pod和Service的访问出口

Ingress:

对集群中服务的外部访问进行管理的API对象,典型的访问方式是HTTP。可以提供负载均衡,SSL终结和基于名称的虚拟托管。

kubectl常用命令

查看node

1
kubectl get nodes

查看pod

1
kubectl get pods --all-namespaces

查看指定namespace下的pod

1
kubectl get pods -n namespace

执行yaml文件

1
kubectl apply -f xxxx.yaml

查看Service

1
kubectl get svc --all-namespaces

查看描述信息

1
kubectl describe pod <pod-name> -n <namespace>

查看pod所在节点

1
kubectl get pods -o wide --all-namespaces

查看apiVersion对应版本

1
kubectl explain pod

进入pod

1
kubectl exec -it <pod-name> --grace-period=0 --force

使用yaml文件删除pod

1
kubectl delete -f xxxx.yaml

在k8s中,我们需要停止服务,主要有如下两种方式:

  1. 通过命令行工具:使用kubectl命令可以管理k8s集群中的资源,停止服务命令如下:
    1
    kubectl delete service [service_name]
  2. 通过api:可以通过k8s api来管理集群中的资源,使用http delete来发送停止服务的请求

什么是应用现代化?对老旧软件进行更新使之采用更新的计算方式,包括更新的语言,框架和基础设施平台,就相当于对旧房进行翻新。通过新技术来更新改造及现代化应用的同时,来延长应用的生命周期。

应用现代化的意义

  • 延长原有应用程序的生命周期
  • 利用计算技术领域的创新成果
  • 发挥原有应用的更大价值

应用现代化的优点

  • 提高新功能的交付速度
  • 通过API方式公开现有应用的功能,供其他服务使用
  • 将应用的平台从本地转变为云,以达到扩大应用规模及提升应用性能

应用现代化面临的挑战

  • 成本:应用现代化绝对不是为了降低成本
  • 复杂性:应用现代化后会带来一定的复杂度

应用现代化模式

  • 从单体式到服务化:利用松散耦合的微服务取代单体式服务,由微服务来负责计算工作
  • 云迁移:通过容器化对应用进行更新改造,让应用更好的适配不同基础设施的部署发布
  • 通过API公开功能:通过API安全地公开功能及数据,让现代化应用能够复用传统服务的功能

现代应用程序(Modern Application)是通过采用云原生体系结构来快速响应事件,满足客户多变需求的一种方法,它的构建采用了容器化,松散耦合的微服务架构模式,Serverless运行模式和DevOps自动化软件交付流程。

什么不是现代化应用

单机应用(不联网,不可扩展的单例),数据存在内存中,不使用源代码控制,不用工具来自动构建和发布新版本,不具备扩展性和适配性。
不是说用了容器技术或跑在k8s上就是现代化应用,在裸机或虚拟机上运行的应用不一定表示它不是现代化的,微服务可以跑在裸机上或虚拟机上运行。
一个应用应该从不同的角度(比如构建,运行,管理,连接和保护)具有某些特质,才能称之为现代化的应用。

现代化应用的特征(微服务,弹性,多云)

  • 微服务
    作为现代化应用的组成部分,服务倾向于遵循UNIX原则,做一件事情,并且做得很好。服务是独立的,意味着服务是可以独立运行,根据访问策略被消费者调用。
  • 弹性
    现代软件理论认为任何系统都一定会发生故障,需要面向故障或失败去设计我们的应用及服务。应用应具备弹性设计原则,以平均无故障时间(MTBF)和平均恢复时间(MTTR)来度量应用的弹性能力。
  • 多云
    随着云计算的普及,面对多云厂商供给,我们在应用设计的时候不可避免的需要考虑多云部署场景。我们通常通过抽象将应用和底层运行环境的硬件和平台解耦来提高了可部署性。
  • 灵活部署
    从裸机到虚拟机,从容器到无服务器的每项技术改进都显示出软件可部署性的提高,每次转换都是软件对运行代码的环境依赖性降低。
  • 虚拟机,容器和无服务器
    围绕应用构建,运行和管理的工具和流程自动化和协调来实现现代化应用部署裸机,容器或虚拟机中。

从部署方式看应用程序

  • 传统应用程序
    直接部署在云服务器(如阿里云的ECS)上,我们一定会经历部署环境的安装及配置(java+nginx,php+apache等),本地编译代码,上传代码到指定的云服务器。
  • 环境无关的现代应用
    通过CI/CD工具来将应用构建打包成Docker镜像,通过k8s或阿里云的ack来部署Docker镜像来实现现代化应用的部署。

Deployment资源对象yaml详解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
apiVersion: extensions/v1beta1
kind: Deployment
metadata: ----------------------------------------#元数据
annotations: -------------------------------------#注释信息
deployment.kubernetes.io/revision: '1'
k8s.kuboard.cn/ingress: 'false'
k8s.kuboard.cn/service: NodePort
k8s.kuboard.cn/workload: nextcloud
labels:-------------------------------------------#标签信息
k8s.kuboard.cn/layer: ''
k8s.kuboard.cn/name: nextcloud
name: nextcloud-----------------------------------#名称
namespace: nextcloud------------------------------#命名空间
spec:-----------------------------------------------#定义容器模板,该模板可以包含多个容器
replicas: 3---------------------------------------#副本数量
selector:-----------------------------------------#标签选择器
matchLabels:
k8s.kuboard.cn/layer: ''
k8s.kuboard.cn/name: nextcloud
strategy:-----------------------------------------#滚动升级策略
type: RollingUpdate-----------------------------#类型
rollingUpdate:----------------------------------#由于replicas为3,则整个升级,pod个数在2-4个之间
maxSurge: 25%---------------------------------#滚动升级时会先启动25%pod
maxUnavailable: 25%---------------------------#滚动升级时允许的最大Unavailable的pod个数
template: #镜像模板
metadata: ------------------------------------#元数据
labels:---------------------------------------#标签
k8s.kuboard.cn/layer: ''
k8s.kuboard.cn/name: nextcloud
spec: ------------------------------------------#定义容器模板,该模板可以包含多个容器
containers: ----------------------------------#容器信息
- name: nextcloud --------------------------#容器名称
image: '172.16.20.100/library/nextcloud:yan' #镜像名称
imagePullPolicy: Always ------------------#镜像下载策略
ports:
- name: http
containerPort: 80
protocol: TCP
env
resources: -------------------------------#CPU内存限制
limits: --------------------------------#限制cpu内存
cpu: 200m
memory: 200m
requests: ------------------------------#请求cpu内存
cpu: 100m
memory: 100m
securityContext: -------------------------#安全设定
privileged: true -----------------------#开启享有特权
volumeMounts: ----------------------------#挂载volumes中定义的磁盘
- name: html ---------------------------#挂载容器1
mountPath: /var/www/html
- name: session ------------------------#挂载容器1
mountPath: /var/lib/php/session
volumes: ------------------------------------#在该pod上定义共享存储卷列表
- name: html -------------------------------#共享存储卷名称 (volumes类型有很多种)
persistentVolumeClaim: -------------------#volumes类型为pvc
claimName: html -----------------------#关联pvc名称
- name: session
persistentVolumeClaim:
claimName: session
restartPolicy: Always ------------------------#Pod的重启策略
#Always表示一旦不管以何种方式终止运行,kubelet都将重启,
#OnFailure表示只有Pod以非0退出码退出才重启,
#Nerver表示不再重启该Pod
schedulerName: default-scheduler -------------#指定pod调度到节点