0%

vpn选型

  • openvpn: mac需要单独安装客户端,虽然以前安装过,暂时不考虑
  • strongswan:不需要客户端,但是放在容器不知道为啥通过127.0.0.1连不上
  • algo:
  • SoftEther:
  • Streisand:
  • WireGuard:

strongswan安装(mac不能连接)

1
2
3
4
5
6
7
8
9
10
11
12
13
14

# ipsec version
Linux Libreswan 4.7 (XFRM) on 5.10.104-linuxkit

# sysctl net.ipv4.ip_forward=1
# sysctl net.ipv6.conf.all.forwarding=1
# sysctl net.ipv4.conf.all.accept_redirects=0
# sysctl net.ipv4.conf.all.send_redirects=0

# SHARED_SECRET="123$(openssl rand -base64 32 2>/dev/null)"
# echo ": PSK \"${SHARED_SECRET}\"" > /etc/ipsec.secrets

# /usr/sbin/ipsec start --nofork

dockerfile源码

错误:mac vpn 连接 发生意外错误 49: Can’t assign requested address

解决: 没找到解决方案,放弃

1
2
3
4
5
6
7
8
9
10
docker run -d --name snx-vpn --cap-add=ALL \
-p 500:500/udp \
-p 4500:4500/udp \
-p 1701:1701/tcp \
-p 1194:1194/udp \
-p 5555:5555/tcp \
-e PSK="1238AwC0L+TIvFTtB2ZKJ+RjWsrQk7qCPrE4JlwXhJaNts=" \
-e USERNAME=admin \
-e PASSWORD=admin123456 \
siomiz/softethervpn

参考

How to Install and Configure strongSwan VPN on Ubuntu 18.04

gaomd/docker-ikev2-vpn-server

strongSwan文档

如何快速搭建VPN,六款VPN服务器上最好的自由和开源工具,轻松搭建个人VPN

需求,电脑想连2个check point vpn,但是网上客户端支持一个

因此另一个打算用snx加容器进行部署然后在用snell来代理到surge上面进行访问,因此需要制作一个snx加上snell的镜像。

采用snell的原因,比较简单,其他的strongSwan、ss都比较复杂。

编译源码件iexxk/checkpoint-snx-snell

使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#启动容器
docker run --name snx-vpn --cap-add=ALL -p 500:500 -v /lib/modules:/lib/modules -d exxk/checkpoint-snx-snell:latest
#进入容器
docker exec -it snx-vpn bash
#登录vpn,执行下面的命令会提示输入密码,然后提示是否接受,然后输入y
snx -s 服务svn的ip -u 用户名
#查看vpn路由地址
route
Destination Gateway Genmask Flags Metric Ref Use Iface
192.16.192.0 0.0.0.0 255.255.224.0 U 0 0 0 tunsnx
192.16.250.1 0.0.0.0 255.255.255.255 UH 0 0 0 tunsnx
U对应SRC-IP类型
UH对应IP-CIDR类型 255.255.224.0对应192.16.192.0/19 详细见:子网掩码计算
一个255对应8位,三个255就是3*8=24,最后一个不是2个8位+11100000(单个1)转换为十进制就是224
#snx断开
snx -d
#停止容器
docker stop snx-vpn
#删除容器
docker rm snx-vpn

自定义修改配置

修改配置可以修改容器内这个/etc/snell/snell-server.conf配置文件,可以修改psk密码(如果暴露在外一定要修改密码)和端口

客户端配置

配置代理

进入surge-->代理-->策略-->规则判断-->新建一个代理

配置

  • 服务器地址:容器的宿主机地址(本机就127.0.0.1)
  • 端口:默认500
  • PSK:默认2iPRYDZyOVfjRwt9
  • 混淆:TLS

然后根据那些地址自己要走代理的地方设置走该代理即可

配置路由规则

进入surge-->代理-->规则-->新建一个规则,添加容器里面的路由到规则里面

终端使用代理

在当前终端执行export https_proxy=http://127.0.0.1:6152;export http_proxy=http://127.0.0.1:6152;export all_proxy=socks5://127.0.0.1:6153

退出终端失效,测试不能用ping,ping不是http协议和socks5协议,用curl -vv https://www.google.com

终端使用ssh代理

ssh -o "ProxyCommand=nc -X 5 -x 127.0.0.1:6153 %h %p" root@10.1.1.10

royal TSX使用代理

连接右键-->properties-->advanced-->SSH-->Additional SSH Options添加该内容-o "ProxyCommand=nc -X 5 -x 127.0.0.1:6153 %h %p"

常见问题

  1. SNX: Virtual Network Adapter initialization and configuration failed. Try to reconnect.

    解决:apt-get install kmod

  2. SNX: Routing table configuration failed. Try to reconnect.

    解决:docker run --cap-add=ALL -v /lib/modules:/lib/modules -t checkpoint-snx-snell:22.9.21 添加--cap-add=ALL

  3. SNX: Connection aborted.

    解决:去vpn服务器用sifra浏览器访问,下载ssl network extender(linux)版本,然后执行docker cp snx_install.sh snx-vpn:/ 进入容器执行chmod +x snx_install.sh && ./snx_install.sh

    解决2: 升级docker版本之后You’re currently on version 4.11.1 (84025). The latest version is 4.13.1 (90346)也提示该错误,回退版本到4.11.1(84025)解决。

  4. Another session of SNX is already running, aborting…

    解决:执行snx -d断开连接,然后重新连接。

参考

子网掩码计算

snx安装包

snx安装先决条件

primovist/snell.sh

surge-networks/snell

Kedu-SCCL/docker-snx-checkpoint-vpn

用 strongSwan 搭建免证书的 IKEv2 VPN

Docker 的(Linux/Mac OS)网络配置问题

Docker for Mac 的网络问题及解决办法

需求

因为Jenkins经常产生尸体容器,所以需要一个定时任务清理错误的容器

解决方案-采用

原生命令:kubectl get pods -n kubesphere-devops-system |grep Error |awk '{print $1}' |xargs kubectl delete pod -n kubesphere-devops-system

  1. 集群管理—>配置中心—>服务账户—>项目[kubesphere-devops-system]—>创建[test]—>选择管理员权限

    单独创建的原因:defalut的账户没有删除的权限,通过创建账号可以生产token,然后修改权限即可,创建的容器会默认加载defalut的token,但是因为没权限,所以需要自己挂载。

  2. 集群管理—>应用负载—>任务—>定时任务[kubesphere-devops-system]—>创建[jenkins-agent-clean]

    容器镜像配置:

    1
    2
    3
    镜像:bitnami/kubectl:latest
    运行命令:sh
    参数:kubectl get pods -n kubesphere-devops-system |grep Error|awk '{print $1}' |xargs kubectl delete pod -n kubesphere-devops-system

    挂载存储配置:

    1
    2
    3
    密钥:test-token-xxxx
    模式:只读
    挂载目录:/var/run/secrets/kubernetes.io/serviceaccount

生成的完整的配置

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
apiVersion: batch/v1beta1
kind: CronJob
metadata:
namespace: kubesphere-devops-system
labels:
app: jenkins-agent-clean
name: jenkins-agent-clean
annotations:
kubesphere.io/description: 定时清理jenkins的死掉编译的容器
spec:
concurrencyPolicy: Forbid
jobTemplate:
metadata:
labels:
app: jenkins-agent-clean
spec:
template:
spec:
containers:
- name: container-suzpfl
imagePullPolicy: IfNotPresent
image: 'bitnami/kubectl:latest'
command:
- sh
args:
- '-c'
- >-
kubectl get pods -n kubesphere-devops-system |grep Error|awk
'{print $1}' |xargs kubectl delete pod -n
kubesphere-devops-system
volumeMounts:
- name: volume-sjpdty
readOnly: true
mountPath: /var/run/secrets/kubernetes.io/serviceaccount
restartPolicy: Never
serviceAccount: default
initContainers: []
volumes:
- name: volume-sjpdty
secret:
secretName: test-token-f2fxz
imagePullSecrets: null
metadata:
annotations:
logging.kubesphere.io/logsidecar-config: '{}'
schedule: 0 * * * *

旧版安装

loki-stack-2.1.2 会安装有状态副本集loki和守护进程集loki-promtail

1
2
3
helm repo add loki https://grafana.github.io/loki/charts
#默认安装有状态副本集loki和守护进程集loki-promtail,--set grafana.enabled=true额外安装grafana
helm upgrade --install loki loki/loki-stack --version 2.1.2 --set grafana.enabled=true --namespace=kubesphere-loki-system

单独的grafana安装

1
2
helm repo add grafana https://grafana.github.io/helm-charts
helm install my-grafana grafana/grafana

新版安装

Loki-stack-2.6.5

1
2
3
helm upgrade --install loki grafana/loki-stack --set grafana.enabled=true
#查看密码
kubectl get secret --namespace <YOUR-NAMESPACE> loki-grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo

配置

Loki的部署如果是emptyDir: {}数据不会持久话,重启会丢失,因此尽量配置nfs目录挂载,重启就不会丢失了。

Grafana Loki 存储保留

查看路径: 平台管理--->集群--->配置中心--->密钥--->[filter]kubesphere-loki-system--->loki--->右侧眼睛(不然是加密的)

修改:在查看路径的基础上 更多操作--->编辑密钥--->loki.yaml--->编辑

Loki.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
auth_enabled: false
chunk_store_config:
max_look_back_period: 0s #为避免查询超过保留期的数据,必须小于或等于table_manager时间值 如果开启24h
compactor:
shared_store: filesystem
working_directory: /data/loki/boltdb-shipper-compactor
ingester:
chunk_block_size: 262144
chunk_idle_period: 3m
chunk_retain_period: 1m
lifecycler:
ring:
kvstore:
store: inmemory
replication_factor: 1
max_transfer_retries: 0
limits_config:
enforce_metric_name: false
reject_old_samples: true #是否拒绝老样本
reject_old_samples_max_age: 168h #168h之前的样本将会被删除
schema_config:
configs:
- from: "2020-10-24"
index:
period: 24h
prefix: index_
object_store: filesystem
schema: v11
store: boltdb-shipper
server:
http_listen_port: 3100
storage_config:
boltdb_shipper:
active_index_directory: /data/loki/boltdb-shipper-active
cache_location: /data/loki/boltdb-shipper-cache
cache_ttl: 24h
shared_store: filesystem
filesystem:
directory: /data/loki/chunks # 块存储路径
table_manager: #表管理器
retention_deletes_enabled: false #是否开启删除 如果开启 true
retention_period: 0s #保留时间,0s不保留 , 如果开启 24h

参考

loki 自定义部署配置

常见错误

  1. 启动过报错

    1
    level=error ts=2022-08-10T01:49:48.744952015Z caller=table.go:81 msg="failed to cleanup table" name=index_19214

创建nfs服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
yum install rpcbind nfs-utils #所有机器都要安装,他是通过宿主机来挂载的
systemctl start rpcbind #开启服务
systemctl start nfs-server # 开启服务
systemctl enable rpcbind # 开机启动
systemctl enable nfs-server #开机启动
mkdir -p /share
vim /etc/exports
#添加如下内容rw表示可读可写; no_root_squash的配置可以让任何用户都能访问此文件夹,192.168.4.*不支持,会出现访问拒绝的错
/share 192.168.4.1(rw,no_root_squash)
#加载配置服务
exportfs -rv
#测试挂载
mount -t nfs 192.168.4.2:/share /root/testshare
#删除挂载
umount /root/testshare
#mac测试挂载,在finder按快捷键command+k,输入如下地址
nfs://192.168.4.2/share

排查问题相关命令

1
2
showmount -e localhost #查询本机nfs共享目录情况
showmount -a localhost #查询本机共享目录连接情况

k8s配置使用nfs存储类nfs-client-provisioner

旧版不支持kubernetes 1.20以上版本

1
2
3
helm repo add stable http://mirror.azure.cn/kubernetes/charts
helm install my-release --set nfs.server=192.168.4.2 --set nfs.path=/share stable/nfs-client-provisioner
helm delete my-release #卸载

新版

1
2
3
4
helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/
helm install nfs-subdir-external-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \
--set nfs.server=192.168.4.2 \
--set nfs.path=/share

使用

创建pvc,新建nginx-pvc-nfs.yaml 文件内容如下

1
2
3
4
5
6
7
8
9
10
11
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nginx-pvc
spec:
storageClassName: nfs-client
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Mi

执行kubectl apply -f nginx-pvc-nfs.yaml ,检查pvc是否创建成功

创建部署,新建nginx-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
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
volumes:
- name: nginx-data
persistentVolumeClaim:
claimName: nginx-pvc
containers:
- name: nginx
image: nginx:alpine
ports:
- containerPort: 80
volumeMounts:
- mountPath: "/usr/share/nginx/html"
name: nginx-data

执行kubectl apply -f nginx-deployment.yaml

总结

nfs-client-provisioner容器只有在创建pvc的时候会通过该容器来连接管理nfs,pvc创建成功之后就与nfs-client-provisioner无关了,不管他是否还在运行。

nfs的挂载不是在容器内部,还是依赖于宿主机,因此宿主机需要有挂载的依赖等等

查看nfs的挂载情况

可以在pod所在机器执行df -h可以看到类似下面的输出

1
10.25.207.176:/mnt/data/kubesphere-loki-system-loki-storage-pvc-dc2431fb-5352-4265-8a9d-0a11b69d8588  9.8G  1.8G  7.5G   19% /var/lib/kubelet/pods/4d276910-7529-4355-8d92-6cfa1da68825/volumes/kubernetes.io~nfs/pvc-dc2431fb-5352-4265-8a9d-0a11b69d8588

删除

eip-nfs-nfs: 存在于kube-system中,是由 Kubernetes StorageClass 创建的资源,用于管理 NFS 存储。

local-path-provisioner:存在于kube-system中,是一种轻量级的存储提供程序,用于在 Kubernetes 中利用节点的本地存储。它通常用于小型或单节点集群。

问题

  1. nfs-client-provisioner容器报错: unexpected error getting claim reference: selfLink was empty, can't make reference

    原因:kubernetes在1.20版本移除了SelfLink,kubernetes Deprecate and remove SelfLink

    解决:nfs-client-provisioner使用新版

  2. 拉去镜像报错:Back-off pulling image "k8s.gcr.io/sig-storage/nfs-subdir-external-provisioner:v4.0.2"

    解决:使用docker代理镜像在线生成地址

  3. 部署nginx时,使用挂载卷,多台时,其中一台报错如下

    1
    2
    3
    4
    异常	FailedMount	2 分钟前
    (近 4 分钟发生 2 次) kubelet Unable to attach or mount volumes: unmounted volumes=[nginx-data], unattached volumes=[nginx-data kube-api-access-vq8pp]: timed out waiting for the condition
    异常 FailedMount 1 秒前
    (近 7 分钟发生 11 次) kubelet MountVolume.SetUp failed for volume "pvc-bb951005-5152-4ab8-ba6c-251d11af5c7a" : mount failed: exit status 32 Mounting command: mount Mounting arguments: -t nfs 192.168.4.2:/share/default-nginx-pvc-pvc-bb951005-5152-4ab8-ba6c-251d11af5c7a /var/lib/kubelet/pods/f274b225-5cec-432b-8b84-35f9355b0486/volumes/kubernetes.io~nfs/pvc-bb951005-5152-4ab8-ba6c-251d11af5c7a Output: mount.nfs: access denied by server while mounting 192.168.4.2:/share/default-nginx-pvc-pvc-bb951005-5152-4ab8-ba6c-251d11af5c7a

    解决:修改/etc/exports添加权限

  4. 客户端连接测试时

    1
    2
    3
    4
    5
    6
    7
    8
    [root@xxx mnt]# mount -t nfs 10.255.7.6:/mnt/data /mnt/test
    mount: 文件系统类型错误、选项错误、10.255.7.6:/mnt/data 上有坏超级块、
    缺少代码页或助手程序,或其他错误
    (对某些文件系统(如 nfs、cifs) 您可能需要
    一款 /sbin/mount.<类型> 助手程序)

    有些情况下在 syslog 中可以找到一些有用信息- 请尝试
    dmesg | tail 这样的命令看看。

    解决:安装nfs客户端:yum install -y nfs-utilssystemctl start nfs-utils

  5. 错误日志如下:

    1
    MountVolume.SetUp failed for volume "pvc-dc2431fb-5352-4265-8a9d-0a11b69d8588" : mount failed: exit status 32 Mounting command: systemd-run Mounting arguments: --description=Kubernetes transient mount for /var/lib/kubelet/pods/bb3fdc10-38de-4437-b8df-81b207e57f1d/volumes/kubernetes.io~nfs/pvc-dc2431fb-5352-4265-8a9d-0a11b69d8588 --scope -- mount -t nfs 10.255.247.176:/mnt/data/kubesphere-loki-system-loki-storage-pvc-dc2431fb-5352-4265-8a9d-0a11b69d8588 /var/lib/kubelet/pods/bb3fdc10-38de-4437-b8df-81b207e57f1d/volumes/kubernetes.io~nfs/pvc-dc2431fb-5352-4265-8a9d-0a11b69d8588 Output: Running scope as unit run-62186.scope. mount: wrong fs type, bad option, bad superblock on 10.255.247.176:/mnt/data/kubesphere-loki-system-loki-storage-pvc-dc2431fb-5352-4265-8a9d-0a11b69d8588, missing codepage or helper program, or other error (for several filesystems (e.g. nfs, cifs) you might need a /sbin/mount.<type> helper program) In some cases useful info is found in syslog - try dmesg | tail or so.

    解决:简短错误信息就是mount 32错误,基本就是挂载忙,或者宿主机没有安装nfs-utils,因此集群所有节点最好执行安装yum install -y nfs-utils,不然部署的时候随机换了一台机器就会提示该错误

ios原生工程配置

  1. Hbuilder导入vue项目
  2. 在Hbuilder执行npm install
  3. 导入资源:在Hbuilder点击发行==>原生App-本地打包==>生产本地打包App资源,日志会输出一个项目 'xxx-app'导出成功,路径为:/Users/xx/workspace/xxx-app/dist/resources/__UNI__xxx/www
  4. 下载SDK(最新iOS平台SDK下载)
  5. 解压SDK,然后双击/Users/xxxx/3.4.18/SDK/HBuilder-Hello/HBuilder-Hello.xcodeproj会通过Xcode打开
  6. 复制第3步生成的__UNI__xxx目录到xcode的HBuilder-Hello/HBuilder-Hello/Pandora/apps/,把原来里面那个删除掉
  7. 修改Xcode项目的infoPlist的中英文件的CFBundleDisplayName的值,这个值是app显示的名字
  8. 修改Xcode项目里面的control的appid为打包的目录名。
  9. 修改Xcode项目的general=>TARGETS=>HBuilder=>Identity的四个信息和Hbuilder里面manifest.json里面的基础配置对应。
  10. 安装证书,拿到两个证书文件,双击.p12文件
  11. 修改Xcode项目的Signing=>TARGETS=>HBuilder=>release发布证书的信息,自动签名勾选去掉。(注意证书是发布还是开发,修改对应的)
  12. 修改Xcode项目的info=>TARGETS=>HBuilder=>Custom IOS Target Properties以下配置key是DCLOUD_AD_ID=打包的目录名和dcloud_appkey=申请的appKey
  13. 打包,在Xcode的菜单Product=>Archive点击,这个的前提是选择运行编译的一栏,选择build的Any iOS Device
  14. 打包过程,依次Distribute App=>Enterprise=>Next=>选择证书

参考

Xcode如何配置发布证书

Xcode如何打包苹果安装离线包

Xcode如何配置应用图标

Xcode如何导入Hbuilder项目进行打包

官方kubernetes文档

kubeadm引导集群安装

两种高可用架构

  • 堆叠etcd模式:etcd和控制平面在同一个节点

    堆叠

  • 外部etcd模式:etcd和控制平面分开

对象:简单理解就是yaml文件

对象必须包含的四大字段:

  • apiVersion - 创建该对象所使用的 Kubernetes API 的版本
  • kind - 想要创建的对象的类别
  • metadata - 帮助唯一性标识对象的一些数据,包括一个 name 字符串、UID 和可选的 namespace
  • spec - 你所期望的该对象的状态(node不需要)

对象种类(kind)

namespace(命名空间)

使用 Kubernetes 名字空间来划分集群。

节点(Node)

节点上的组件包括 kubelet容器运行时以及 kube-proxy

pod-最小单元

由一组容器组成,最小的可部署的计算单元。

deployments-部署

一个 Deployment 为 PodReplicaSet 提供声明式的更新能力。

ReplicaSet-副本

维护Pod 副本的稳定集合。 常用来保证给定数量的、完全相同的 Pod 的可用性。一般由Deployment里面定义。

StatefulSet-有状态

管理有状态应用的工作负载 API 对象。为这些 Pod 提供持久存储(pv)和持久标识符。

DaemonSet-守护

确保全部(或者某些)节点上运行一个 Pod 的副本,和pod共存亡,一般用于守护进程。

job-任务

job 会创建一个或者多个 Pod,并将继续重试 Pod 的执行,直到指定数量的 Pod 成功终止。 随着 Pod 成功结束,Job 跟踪记录成功完成的 Pod 个数。 当数量达到指定的成功个数阈值时,任务(即 Job)结束。 删除 Job 的操作会清除所创建的全部 Pod。 挂起 Job 的操作会删除 Job 的所有活跃 Pod,直到 Job 被再次恢复执行。

CronJob-定时任务

CronJob 用于执行周期性的动作,例如备份、报告生成等。 这些任务中的每一个都应该配置为周期性重复的(例如:每天/每周/每月一次); 你可以定义任务开始执行的时间间隔。

ReplicationController-副本

ReplicationController 确保在任何时候都有特定数量的 Pod 副本处于运行状态。现推荐 ReplicaSetDeployment 来建立副本管理机制

Service-暴露服务

将运行在一组 Pods 上的应用程序公开为网络服务的抽象方法。

Ingress-路由

Ingress 是对集群中服务的外部访问进行管理的 API 对象,典型的访问方式是 HTTP。

Ingress 可以提供负载均衡、SSL 终结和基于名称的虚拟托管。

EndpointSlice-

端点切片(EndpointSlices) 提供了一种简单的方法来跟踪 Kubernetes 集群中的网络端点 (network endpoints)。它们为 Endpoints 提供了一种可伸缩和可拓展的替代方案。

PersistentVolumeClaim-PVC

PersistentVolume-PV

StorageClass-存储类

StorageClass 为管理员提供了描述存储 “类” 的方法。 不同的类型可能会映射到不同的服务质量等级或备份策略,或是由集群管理员制定的任意策略。

VolumeSnapshot-卷快照

每个 VolumeSnapshot 包含一个 spec 和一个状态。

VolumeSnapshotContent-预配置快照

VolumeSnapshotClass-卷快照类

VolumeSnapshotClass 提供了一种在配置卷快照时描述存储“类”的方法。

KubeSchedulerConfiguration-调度器配置

pod-缩写po

概念:Pod 类似于共享名字空间和文件系统卷的一组 Docker 容器。
简单部署

文件nginx-pod.yaml

1
2
3
4
5
6
7
8
9
10
11
12
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels: #标签
app: nginx #标签为了后面service的selector
spec:
containers:
- name: nginx
image: nginx:alpine
ports:
- containerPort: 80

基本操作:

1
2
3
4
kubectl apply -f nginx-pod.yaml #部署pod
kubectl get po #查看pod
kubectl describe pods nginx #查看pod详情
kubectl delete -f nginx-pod.xml #删除

Pod 建议不要直接创建,而是使用工作负载资源创建的。原因:Kubernetes Pods 有确定的生命周期。在pod所在的节点重启之后,pod需要重新创建。

挂载卷

k8s volume挂载卷

service

概念:将运行在一组 Pods 上的应用程序公开为网络服务的抽象方法。
简单部署

文件nginx-service.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
type: NodePort
selector: #选择器
app: nginx #选择标签app=nginx的pod
ports:
- protocol: TCP
port: 9376 #映射端口,可以说是集群内服务端口,默认情况port设置成容器内部端口一致
targetPort: 80 #容器内端口
nodePort: 30000 #对外暴露端口,外网访问端口

基本操作

1
2
3
4
kubectl apply -f nginx-service.yaml #部署服务
kubectl get service #查看服务
kubectl describe service nginx-service #查看服务详情
kubectl delete -f nginx-service.yaml #删除服务

Deployment(工作负载)-缩写deploy

概念:一个 Deployment 为 PodReplicaSet 提供声明式的更新能力。
简单部署

文件nginx-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
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 2 #副本,默认值1
selector: #选择标签,创建后不可改变
matchLabels:
app: nginx #标签
template: #是一个pod的模版
metadata:
labels: #于外面的标签同步设置,要明确指定
app: nginx
spec:
volumes:
- name: nginx-data
persistentVolumeClaim:
claimName: nginx-pvc
containers:
- name: nginx
image: nginx:alpine
ports:
- containerPort: 80
volumeMounts:
- mountPath: "/usr/share/nginx/html"
name: nginx-data

基本操作

1
2
3
4
5
6
7
8
9
10
11
12
13
kubectl apply -f nginx-deployment.yaml #部署
kubectl get deploy #查看部署或者kubectl get deployment
kubectl describe deploy nginx-deployment #查看部署详情
kubectl delete -f nginx-deployment.yaml #删除部署
kubectl edit deploy/nginx-deployment #编辑部署
kubectl rollout status deployment/nginx-deployment #查看部署状态
kubectl rollout restart deploy/nginx-deployment #重新部署
kubectl get rs #查看部署副本期望与实际
kubectl rollout history deployment/nginx-deployment #查看历史版本
kubectl rollout history deployment/nginx-deployment --revision=2 #查看历史版本2的详细信息
kubectl rollout undo deployment/nginx-deployment #撤销当前版本
kubectl rollout undo deployment/nginx-deployment --to-revision=2 #回滚到指定版本
kubectl scale deployment/nginx-deployment --replicas=10 #缩放副本

CRD

概念定制资源(Custom Resource) 是对 Kubernetes API 的扩展,存取结构化的数据。

Operator

etcd/中文

etcd是一种高度一致的分布式键值存储,它提供了一种可靠的方式来存储需要由分布式系统或机器集群访问的数据。它在网络分区期间优雅地处理领导者选举,并且可以容忍机器故障,即使在领导者节点中也是如此。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#存数据
etcdctl put keyName "I am value"
#获取数据
etcdctl get keyName
#kk安装的etcd环境变量文件
cat /etc/etcd.env
#临时设置别名,简化命令,endpoints要设置所有集群ip才能检测健康状态,不然只检查填写的ip的
alias etcdctl='etcdctl --endpoints=https://192.168.14.16:2379,https://192.168.14.17:2379,https://192.168.14.18:2379 --cacert=/etc/ssl/etcd/ssl/ca.pem --cert=/etc/ssl/etcd/ssl/admin-node1.pem --key=/etc/ssl/etcd/ssl/admin-node1-key.pem'
#查看成员
etcdctl member list
#移除成员
/usr/local/bin/etcdctl --endpoints=https://192.168.14.16:2379,https://192.168.14.17:2379 member list
/usr/local/bin/etcdctl --endpoints=https://192.168.14.16:2379,https://192.168.14.17:2379 member remove cab52e8fded2eefe
#查看集群健康状态
etcdctl endpoint health
#kk查看集群状态命令
export ETCDCTL_API=2;
export ETCDCTL_CERT_FILE='/etc/ssl/etcd/ssl/admin-node1.pem';
export ETCDCTL_KEY_FILE='/etc/ssl/etcd/ssl/admin-node1-key.pem';
export ETCDCTL_CA_FILE='/etc/ssl/etcd/ssl/ca.pem';
/usr/local/bin/etcdctl --endpoints=https://192.168.14.16:2379,https://192.168.14.17:2379 cluster-health

etcd解决替换,可以先remove,然后通过kk安装新的节点。

etcd容器安装 vs 虚拟机master节点安装 vs 独立虚拟机安装

etcd备份

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#查看证书路径
[root@master home]# cat /etc/systemd/system/etcd.service
EnvironmentFile=/etc/etcd.env 可以看到这一行
[root@master home]# cat /etc/etcd.env
# CLI settings
ETCDCTL_ENDPOINTS=https://127.0.0.1:2379
ETCDCTL_CACERT=/etc/ssl/etcd/ssl/ca.pem
ETCDCTL_KEY=/etc/ssl/etcd/ssl/admin-master-key.pem
ETCDCTL_CERT=/etc/ssl/etcd/ssl/admin-master.pem
#替换证书进行备份
[root@master home]# ETCDCTL_API=3 etcdctl snapshot save /home/etcd-snapshot.db \
--endpoints=https://127.0.0.1:2379 \
--cert=/etc/ssl/etcd/ssl/admin-master.pem \
--key=/etc/ssl/etcd/ssl/admin-master-key.pem \
--cacert=/etc/ssl/etcd/ssl/ca.pem

MAC安装

1
2
3
pip3 install scrapy #安装scrapy
scrapy startproject testSpider #创建工程
scrapy crawl name #运行