一、创建命名空间
1、编写yaml文件
vim namespace.yaml
---
apiversion: v1 # api版本
kind: Namespace # 创建类型----(Namespace命名空间)
metadata: # 元数据
name: ns-monitor # 起个名字 (给元数据的名字)
labels: # 标签
name: ns-monitor # 标签的名字
2、创建资源
# kubectl apply -f namespace.yaml
回显 namespace/ns-monitor created (以创建成功)
# kubectl apply -f namespace.yaml --validate # 查看报错信息
3、查看所以命名空间里的资源
# kubectl get namespace
4、查看命名空间内的某个资源
# kubectl get namespace ns-monitor
5、删除命名空间
# kubectl delete -f namespace.yaml
# kubectl delete namespace ns-monitor
二、创建第一个pod
1、编写pod的压目文件
vim pod.yaml
---
apiversion: v1
kind: Pod
metadata:
name: website
labels:
app: website # 打标签
spec: # 指定的意思(属性,定义的是Pod)
containers: # 定义容器
- name: test-website # 容器的名字,自定义
image: daocloud.io/librery/nginx # 镜像
ports:
- containerPort: 80 # 容器暴露的端口
nodeName: k8s-node1 # 指定node节点的名称
2、查看pod
# kubectl delete pod --all //批量删除
# kubectl get pods
回显:
名称 准备状态 pod的状态 pod的重启次数
NAME READY STATUS RESTARTS AGE 运行时间
website 1/1 Running 0 74s
3、查看pod运行在那台机器上
# kubectl get pods -o wide
4、查看pod定义的详细信息
# kubectl get pod website -o yaml
-o: output
yaml: 是yaml格式还是json格式
5、查看kubectl describe 支持查询Pod的状态和生命周期事件
# kubectl desribe pod website
各字段含义:
spec:指定资源的内容
Name: Pod的名称
Namespace: Pod的Namespace。
Image(s): Pod使用的镜像
Node: Pod所在的Node。
Start Time: Pod的起始时间
Labels: Pod的Label。
Status: Pod的状态。
Reason: Pod处于当前状态的原因。
Message: Pod处于当前状态的信息。
IP: Pod的PodIP
Replication Controllers: Pod对应的Replication Controller。
===============================
2.Containers:Pod中容器的信息
Container ID: 容器的ID
Image: 容器的镜像
Image ID:镜像的ID
State: 容器的状态
Ready: 容器的准备状况(true表示准备就绪)。
Restart Count: 容器的重启次数统计
Environment Variables: 容器的环境变量
Conditions: Pod的条件,包含Pod准备状况(true表示准备就绪)
Volumes: Pod的数据卷
Events: 与Pod相关的事件列表
=====
生命周期:指的是status通过# kubectl get pod
生命周期包括:running、Pending、completed、
6、实战
vim pod.yaml
---
apiversion: v1
kind: Pod
metadata:
name: tomcat
labels:
app: tomcat # 打标签
spec: # 指定的意思(属性,定义的是Pod)
containers: # 定义容器
- name: test- tomcat # 容器的名字,自定义
image: daocloud.io/librery/ tomcat:8 # 镜像
ports:
- containerPort: 8080 # 容器暴露的端口
nodeSelector: # 指定标签
kubernetes.io/hostname: k8s-node1
7、域名解析
上面省略
spec:
hostAliases:
- ip: "k8s-node1的IP" #自定义 给哪个ip做解析。实验环境下这个ip自定义的
hostnames:
- "foo.remote" #自定义 解析的名字。用引号引起来可以写多个
- "bar.remote"
containers:
- name: test-tomcat
image: daocloud.io/library/tomcat:8
ports:
- containerPort: 8080创建
kubectl exec -it 名字 /bin/bash
cat /etc/hosts
8、创建共享名称空间
spec:
shareProcessNamespace: true #共享进程名称空间
containers:
- name: test-web
image: daocloud.io/library/nginx
ports:
- containerPort: 80
- name: busybos
image: daocloud.io/library/busybox
stdin: true
tty: true解释:
定义了两个容器:
一个 nginx 容器
一个开启了 tty 和 stdin 的 busybos 容器可以直接认为 tty 就是 Linux 给用户提供的一个常驻小程序,用于接收用户的标准输入,返回操作系统的标准输出。为了能够在 tty 中输入信息,需要同时开启 stdin(标准输入流)。
9 、Pod 中的容器要共享宿主机的 Namespace,也一定是 Pod 级别的定义
---
apiVersion: v1
kind: Pod
metadata:
name: website
labels:
app: website
spec:
hostNetwork: true #共享宿主机网络
hostIPC: true #共享ipc通信
hostPID: true #共享宿主机的pid
containers:
- name: test-web
image: daocloud.io/library/nginx
ports:
- containerPort: 80
- name: busybos
image: daocloud.io/library/busybox
stdin: true
tty: true
定义了共享宿主机的 Network、IPC 和 PID Namespace。这样,
此 Pod 里的所有容器,会直接使用宿主机的网络、直接与宿主机进行 IPC 通信、看到宿主机里正在运行的所有进程。
---
apiVersion: v1
kind: Pod
metadata:
name: lifecycle-demo
spec:
containers:
- name: lifecycle-demo-container
image: daocloud.io/library/nginx
lifecycle: # 生命周期 感知组件
postStart: #容器启动之后
exec:
command: ["/bin/sh", "-c", "echo Hello from the postStart handler > /usr/share/message"]
preStop: #容器关闭之前
exec:
command: ["/usr/sbin/nginx","-s","quit"]验证:
kubectl get pod -o wide # 查看 lifecycle-demo在k8s-node那个上面运行,在k8s-node1上运行
k8s-node1 ~ ] # docker exec -it lifecycle-demo(镜像的IP或名字) /bin/bs
k8s-node1 ~ ] # cat /usr/share/message
回显: Hello from the postStart handler
二、Secret
1、Secret 对象要求这些数据必须是经过 Base64 转码的,以免出现明文密码的安全隐患。
2、生产环境中,需要在 Kubernetes 中开启 Secret 的加密插件,增强数据的安全性。
所有Pod会默认使用这个Secret与apiserver通信
1、用yaml创建Secret
base64解码,明文显示容易被别人发现,这里先转码。
echo -n 'admin' | base64d 回显: YWRtaW4=
echo -n '1f2d1e2e67df(密码)' | nase64 回显: MWYyZDFlMmU2N2Rm
vim secret.yaml
---
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque # 模糊
data: # Secret 对象的 data 字段指定的 Key。
username: YWRtaW4=
password: MWYyZDFlMmU2N2Rm
vim pod_use_secret.yaml
----
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: testredis
image: daocloud.io/library/redis
volumeMounts: #挂载一个卷
- name: foo #这个名字需要与定义的卷的名字一致
mountPath: "/etc/foo" #挂载到容器里哪个目录下,随便写
readOnly: true
volumes: #数据卷的定义
- name: foo #卷的名字这个名字自定义
secret: #卷是直接使用的secret。
secretName: mysecret #调用刚才定义的secretitems: #定义一个items
- key: username #将那个key重新定义到那个目录下
path: my-group/my-username #相对路径,相对于/etc/foo的路径username被映射到了文件/etc/foo/my-group/my-username而不是/etc/foo/username
创建:
[root@kub-k8s-master prome]# kubectl apply -f pod_use_secret.yaml
回显: pod/mypod created
[root@kub-k8s-master prome]# kubectl exec -it mypod /bin/bash
root@mypod:/data# cd /etc/foo/
root@mypod:/etc/foo# ls
回显: password username
root@mypod:/etc/foo# cat password
回显: 1f2d1e2e67df
2、被挂载的secret内容自动更新
1.设置base64加密
# echo qianfeng | base64
回显:cWlhbmZlbmcK
2.将admin替换成qianfeng
# vim secret.yml
---
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque # 模糊
data:
username: cWlhbmZlbmcK #修改为qianfeng的base64加密后的
password: MWYyZDFlMmU2N2Rm1.创建
# kubectl apply -f secret.yml
回显:Warning: kubectl apply should be used on resource created by either kubectl create --save-config or kubectl apply
secret/mysecret configured
2.连接pod容器 (prome自己创建的文件名称)
[root@kub-k8s-master prome]# kubectl exec -it mypod /bin/bash
root@mypod:/data# cd /etc/foo/my-group
root@mypod:/etc/foo/my-group# ls
回显:my-username
root@mypod:/etc/foo/my-group# cat my-username
回显:qianfeng
3、以环境变量的形式使用Secret
[root@kub-k8s-master prome]# kubectl delete -f pod_use_secret.yaml
pod "mypod" deleted
[root@kub-k8s-master prome]# vim pod_use_secret.yaml
---
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: testredis
image: daocloud.io/library/redis
env: #定义环境变量
- name: SECRET_USERNAME #创建新的环境变量名称
valueFrom:
secretKeyRef: #调用的key是什么
name: mysecret #变量的值来自于mysecret
key: username #username里面的值envFrom: #自定义环境变量
- configMapRef: #单曲变量
name: config-map
restartPolicy: Never # 重启策略2.创建使用secret的pod容器
[root@kub-k8s-master prome]# kubectl apply -f pod_use_secret.yaml
回显:pod/mypod created
3.连接
[root@kub-k8s-master prome]# kubectl exec -it mypod /bin/bash
root@mypod:/data# echo $SECRET_USERNAME #打印一下定义的变量
qianfeng
三、ConfigMap 与 Secret 类似,用来存储配置文件的kubernetes资源对象,所有的配置内容都存储在etcd中。
ConfigMap 保存的是不需要加密的、应用所需的配置信息。
1、创建ConfigMapp
# kubectl create configmap test-configmap --from-literal=user=admin --from-literal=pass=1122334
# kubectl get configmap test-configmap -o yaml
apiVersion: v1
data:
pass: "1122334"
user: admin
。。。。
2、通过指定文件创建
vim app.properties
property.1 = value-1
property.2 = value-2
property.3 = value-3
property.4 = value-4
[mysqld]
!include /home/wing/mysql/etc/mysqld.cnf
port = 3306
socket = /home/wing/mysql/tmp/mysql.sock
pid-file = /wing/mysql/mysql/var/mysql.pid
basedir = /home/mysql/mysql
datadir = /wing/mysql/mysql/var[root@kub-k8s-master prome]# kubectl create configmap test-config2 --from-file=app.properties
[root@kub-k8s-master prome]# kubectl get configmap test-config2 -o yaml
apiVersion: v1
data:
app.properties: |
property.1 = value-1
property.2 = value-2
property.3 = value-3
property.4 = value-4[mysqld]
!include /home/wing/mysql/etc/mysqld.cnf
port = 3306
socket = /home/wing/mysql/tmp/mysql.sock
pid-file = /wing/mysql/mysql/var/mysql.pid
basedir = /home/mysql/mysql
datadir = /wing/mysql/mysql/var
kind: ConfigMap
metadata:
creationTimestamp: "2019-10-21T08:01:43Z" # 创建时间戳
name: test-config2
namespace: default
resourceVersion: "188765" # 资源的版本
selfLink: /api/v1/namespaces/default/configmaps/test-config2
uid: 790fca12-3900-4bf3-a017-5af1070792e5