ConfigMap & Secret

ConfigMap

容器中通常存放程序代码、二进制程序,如密码、配置文件等一些变量可以通过ConfigMap来存储,创建
ConfigMap.yaml。

1
2
3
4
5
6
apiVersion: v1
kind: ConfigMap
metadata:
name: mongo-config
data:
mongoHost: mongodb-0.mongodb

应用yaml文件。

1
2
3
4
# 应用
kubectl apply -f configmap.yaml
# 查看
kubectl get configmap mongo-config -o yaml

Secret

secret.yaml

1
2
3
4
5
6
7
8
9
10
apiVersion: v1
kind: Secret
metadata:
name: mongo-secret
# Opaque 用户定义的任意数据,更多类型介绍 https://kubernetes.io/zh/docs/concepts/configuration/secret/#secret-types
type: Opaque
data:
# 数据要 base64。https://tools.fun/base64.html
mongo-username: bW9uZ291c2Vy
mongo-password: bW9uZ29wYXNz

Read More

Kubernetes基础

本文目录结构

虚拟机与容器的区别

虚拟机(Virtual Machine, VM)和容器(Container)是两种不同的虚拟化技术,它们在资源隔离、部署和扩展、操作系统支持等方面有着各自的特点和优劣。

  • 资源隔离: 虚拟机通过在物理硬件上创建完整的虚拟操作系统环境,使得每个虚拟机拥有独立的操作系统和应用程序,彼此之间资源隔离。而容器技术通过将应用程序及其运行环境打包成容器,容器之间共享同一个操作系统内核,使得容器之间资源相互隔离。
  • 部署和扩展: 虚拟机需要安装和配置相应的操作系统,部署和扩展相对繁琐。容器只需将应用程序及其运行环境打包成一个容器镜像,然后通过容器引擎在集群中部署和扩展。这使得容器在部署和扩展方面更加轻量级和灵活。
  • 操作系统支持: 虚拟机通过虚拟化技术提供完整的操作系统环境,可以运行任何支持的操作系统。容器技术通常支持一个或多个应用程序及其运行环境,只能运行在特定的操作系统上。
  • 资源占用: 虚拟机需要为每个虚拟机分配独立的操作系统资源,因此资源占用较高。容器共享同一个操作系统内核,资源占用相对较低。
  • 安全性: 虚拟机之间通过虚拟化层隔离,安全性较高;容器之间通过操作系统内核隔离,安全性相对较低。
  • 应用场景: 虚拟机适用于需要运行不同操作系统或对资源隔离要求较高的场景,如数据库、Web服务器等。容器适用于微服务架构下的应用程序开发、部署和扩展,以及轻量级、需要快速启动的场景,如Web应用程序、API服务等。

容器技术

容器技术是指将应用程序及其依赖项打包在一起,形成一个独立的单元,可以在任何支持容器运行时环境的操作系统上运行。容器技术的主要优点包括易于移植、可扩展、易于管理、易于组合和隔离。常见的容器技术包括Docker、rkt、containerd等。以Docker为例本质由命名空间cgroup镜像三块组成。

Read More

StatefulSet & 数据持久化

本文目录结构

设置有状态服务(StatefulSet)

创建有状态的Pod,执行”kubectl apply -f mongo.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
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mongodb
spec:
serviceName: mongodb
replicas: 3
selector:
matchLabels:
app: mongodb
template:
metadata:
labels:
app: mongodb
spec:
containers:
- name: mongo
image: mongo:4.4
# IfNotPresent 仅本地没有镜像时才远程拉,Always 永远都是从远程拉,Never 永远只用本地镜像,本地没有则报错
imagePullPolicy: IfNotPresent
---
apiVersion: v1
kind: Service
metadata:
name: mongodb
spec:
selector:
app: mongodb
type: ClusterIP
# HeadLess
clusterIP: None
ports:
- port: 27017
targetPort: 27017

以上mongo.yaml包涵了创建StatefulSet特性的pod和Service,关于StatefulSet特性:

  • Service 的 CLUSTER-IP 是空的,Pod 名字也是固定的。
  • Pod 创建和销毁是有序的,创建是顺序的,销毁是逆序的。
  • Pod 重建不会改变名字,除了IP,所以不要用IP直连

查看创建的pods。

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
kubectl get endpoints mongodb -o yaml
apiVersion: v1
kind: Endpoints
metadata:
annotations:
endpoints.kubernetes.io/last-change-trigger-time: "2023-10-18T09:13:07Z"
creationTimestamp: "2023-10-18T09:13:07Z"
labels:
service.kubernetes.io/headless: ""
name: mongodb
namespace: default
resourceVersion: "218593"
selfLink: /api/v1/namespaces/default/endpoints/mongodb
uid: 448feace-dbd8-4c94-b878-688566266bcb
subsets:
- addresses:
- hostname: mongodb-0
ip: 172.17.0.14
nodeName: vm-1-127-centos
targetRef:
kind: Pod
name: mongodb-0
namespace: default
resourceVersion: "212661"
uid: a265b68e-1aaf-409a-b84e-2f2851061314
- hostname: mongodb-1
ip: 172.17.0.15
nodeName: vm-1-127-centos
targetRef:
kind: Pod
name: mongodb-1
namespace: default
resourceVersion: "212671"
uid: 578c3937-6c06-4ef3-bcda-8bd5f594607d
- hostname: mongodb-2
ip: 172.17.0.16
nodeName: vm-1-127-centos
targetRef:
kind: Pod
name: mongodb-2
namespace: default
resourceVersion: "212685"

这时可以连接到mongodb上进行写入数据测试。

Read More

Service

本文目录结构

创建Service

创建pod

首先创建pod,层接上节课内容,创建内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
apiVersion: apps/v1
kind: Deployment
metadata:
# 部署名字
name: djnode
spec:
replicas: 5
# 用来查找关联的 Pod,所有标签都匹配才行
selector:
matchLabels:
app: djnode
# 定义 Pod 相关数据
template:
metadata:
labels:
app: djnode
spec:
# 定义容器,可以多个
containers:
- name: djnode # 容器名字
image: djangowang77/djnode:v1 # 镜像

创建 Service

通过标签与djnode进行关联,创建service.yaml.

1
2
3
4
5
6
7
8
9
10
11
apiVersion: v1
kind: Service
metadata:
name: djnode
spec:
selector:
app: djnode
type: ClusterIP
ports:
- port: 8080 # 本 Service 的端口
targetPort: 8080 # 容器端口

应用配置“kubectl apply -f service.yaml”,查看servers。

1
2
3
4
kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
djnode NodePort 10.98.196.188 <none> 8080:31000/TCP 64m
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5h23m

查看服务详情 kubectl describe svc djnode,可以发现 Endpoints 是各个 Pod 的 IP,也就是他会把流量转发到这些节点。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
kubectl describe svc djnode
Name: djnode
Namespace: default
Labels: <none>
Annotations: <none>
Selector: app=djnode
Type: ClusterIP
IP Families: <none>
IP: 10.105.106.201
IPs: <none>
Port: <unset> 8080/TCP
TargetPort: 8080/TCP
Endpoints: 172.17.0.2:8080,172.17.0.3:8080,172.17.0.5:8080
Session Affinity: None
Events: <none>

对外暴露服务

修改service.yaml内容如下。

1
2
3
4
5
6
7
8
9
10
11
12
apiVersion: v1
kind: Service
metadata:
name: djnode
spec:
selector:
app: djnode
type: NodePort
ports:
- port: 8080 # 本 Service 的端口
targetPort: 8080 # 容器端口
nodePort: 31000

查看暴露的端口,可以通过web浏览器访问以下端口

1
2
netstat -tnl | grep 31000
tcp 0 0 0.0.0.0:31000 0.0.0.0:* LISTEN

将容器部署到集群中

本文目录结构

容器部署方式

命令运行容器。

1
kubectl run testapp --image=ccr.ccs.tencentyun.com/k8s-tutorial/test-k8s:v1

Pod,编辑pod.yaml内容如下。(一切皆文件是 Unix/Linux 的基本哲学之一,K8s继承了这个传统)

1
2
3
4
5
6
7
8
9
apiVersion: v1
kind: Pod
metadata:
name: test-pod
spec:
# 定义容器,可以多个
containers:
- name: test-k8s # 容器名字
image: ccr.ccs.tencentyun.com/k8s-tutorial/test-k8s:v1 # 镜像

Deployment,编辑Deployment.yaml内容如下。以下文件描述了运维工程师对线上服务的期望,并把线上的服务状态、副本、镜像源都转为配置文件进行描述,其优势所见即所得,且此配置文件可以分享给其他运维工程师重复利用或了解当前服务的配置情况。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
apiVersion: apps/v1
kind: Deployment
metadata:
# 部署名字
name: test-k8s
spec:
replicas: 2
# 用来查找关联的 Pod,所有标签都匹配才行
selector:
matchLabels:
app: test-k8s
# 定义 Pod 相关数据
template:
metadata:
labels:
app: test-k8s
spec:
# 定义容器,可以多个
containers:
- name: test-k8s # 容器名字
image: ccr.ccs.tencentyun.com/k8s-tutorial/test-k8s:v1 # 镜像

kubectl运行deployment.yaml文件

1
2
kubectl apply -f deployment.yaml
kubectl get pods

关于kind相关参数:

  • Deployment:适合无状态应用,所有pod等价,可替代;
  • StatefulSet:有状态的应用,适合数据库这种类型;
  • DaemonSet:在每个节点上跑一个 Pod,可以用来做节点监控、节点日志收集等;
  • Job & CronJob: Job 用来表达的是一次性的任务,而 CronJob 会根据其时间规划反复运行。

Read More

minikube单机演练环境配置

本文目录结构

关于minikube

minikube可以模拟本机的Kubernetes集群环境,这集群就包含了Master和Node,当前它支持Windows、Linux和MaxOS等操作系统,官网https://minikube.sigs.k8s.io/docs/。

环境信息

操作系统发行版本

Linux CentOS7.9版本

minikube安装要求

  • 至少2CPUs或更多CPUS
  • 至少2GB或更多内存
  • 至少20GB或更多磁盘空间
  • 连接互联网
  • 容器或虚拟机环境,如Docker, QEMU, Hyperkit, Hyper-V, KVM, Parallels, Podman, VirtualBox, or VMware Fusion/Workstation

安装与配置Docker

安装minikube前,先要安装Docker。

1
yum install -y docker 

配置国内镜像源

1
2
3
4
5
6
cat <<EOF > daemon.json
{
"registry-mirrors": ["https://ud6340vz.mirror.aliyuncs.com"]
}
EOF
mv daemon.json /etc/docker/

再次确认。

1
cat /etc/docker/daemon.json

启动容器。

1
systemctl restart docker

Read More

李想产品实践16讲

这是一门得到的课程,由理想汽车CEO李想亲自讲解的,课程介绍了理想汽车在做产品过程中从0~1,再从整个1-10的过程和他的思考。课程结构非常清晰,课程从回归产品的本质开始讲起,从以下两个方法论进行切入并不断地延展.

  • 第一条:关注用户价值,超越用户需求
  • 第二条:把组织当产品来做,用组织的成长支撑产品的成长

课程非常适合产品经理或用户体验等职位人群.整个 课程一共16讲,我刚听到第9讲,以下整理了前8讲的课程思维导图,供大家参考,后续课程内容会持续更新.

1~8课

9~16 课