kubernetes基本概念
- Pod:k8s最小部署单元,一组容器的集合
- Deployment:最常见的控制器,用于更高级别部署和管理Pod
- Service:为一组Pod提供负载均衡,对外提供统一访问入口
- Label:标签,附加到某个资源上,用于关联对象、查询和筛选
- Namespaces:命名空间。将对象逻辑上隔离,也利于权限控制
kubectl管理命令
类型 | 命令 | 描述 |
---|---|---|
基础命令 | create expose run expose set explain get edit delete | 通过文件名或标准输入创建资源; 为Deployment,Pod创建Service; 在集群中运行一个特定的镜像; 在对象上设置特定的功能; 文档参考资料; 显示一个或多个资源; 使用系统编辑器编辑一个资源; 通过文件名,标准输入,资源名称或标签选择器来删除资源 |
部署命令 | rollout rolling-update scale autoscale | 管理Deployment,Daemonset资源的发布(例如状态、发布记录、回滚等); 滚动升级,仅限ReplicationController; 对Deployment、ReplicaSet、RC或Job资源扩容或缩容Pod数量; 为Deploy,RS,RC配置自动伸缩规则(依赖metrics-server和hpa) |
集群管理命令 | certificate cluster-info top cordon uncordon drain taint | 修改证书资源; 显示集群信息; 查看资源利用率(依赖metrics-server); 标记节点不可调度; 标记节点可调度; 驱逐节点上的应用,准备下线维护; 修改节点taint标记 |
kubectl帮助
kubectl命令官方文档
用kubectl help可以查看kubectl相关的命令
[root@master ~]# kubectl --help
kubectl controls the Kubernetes cluster manager.
Find more information at: https://kubernetes.io/docs/reference/kubectl/overview/
Basic Commands (Beginner):
create Create a resource from a file or from stdin.
expose 使用 replication controller, service, deployment 或者 pod 并暴露它作为一个新的Kubernetes Service
run 在集群中运行一个指定的镜像
set 为 objects 设置一个指定的特征
Basic Commands (Intermediate):
explain 查看资源的文档
get 显示一个或更多 resources
edit 在服务器上编辑一个资源
delete Delete resources by filenames, stdin, resources and names, or by resources and label selector
Deploy Commands:
rollout Manage the rollout of a resource
scale 为 Deployment, ReplicaSet, Replication Controller 或者 Job 设置一个新的副本数量
autoscale 自动调整一个 Deployment, ReplicaSet, 或者 ReplicationController 的副本数量
Cluster Management Commands:
certificate 修改 certificate 资源.
cluster-info 显示集群信息
top Display Resource (CPU/Memory/Storage) usage.
cordon 标记 node 为 unschedulable
uncordon 标记 node 为 schedulable
drain Drain node in preparation for maintenance
taint 更新一个或者多个 node 上的 taints
Troubleshooting and Debugging Commands:
describe 显示一个指定 resource 或者 group 的 resources 详情
logs 输出容器在 pod 中的日志
attach Attach 到一个运行中的 container
exec 在一个 container 中执行一个命令
port-forward Forward one or more local ports to a pod
proxy 运行一个 proxy 到 Kubernetes API server
cp 复制 files 和 directories 到 containers 和从容器中复制 files 和 directories.
auth Inspect authorization
Advanced Commands:
diff Diff live version against would-be applied version
apply 通过文件名或标准输入流(stdin)对资源进行配置
patch 使用 strategic merge patch 更新一个资源的 field(s)
replace 通过 filename 或者 stdin替换一个资源
wait Experimental: Wait for a specific condition on one or many resources.
convert 在不同的 API versions 转换配置文件
Settings Commands:
label 更新在这个资源上的 labels
annotate 更新一个资源的注解
completion Output shell completion code for the specified shell (bash or zsh)
Other Commands:
alpha Commands for features in alpha
api-resources Print the supported API resources on the server
api-versions Print the supported API versions on the server, in the form of "group/version"
config 修改 kubeconfig 文件
plugin Provides utilities for interacting with plugins.
version 输出 client 和 server 的版本信息
Kubectl常用命令的使用
explain
获取资源
用法:
kubectl explain RESOURCE
//获取资源及其字段的文档
、[root@master ~]# kubectl explain pods
KIND: Pod
VERSION: v1
DESCRIPTION:
Pod is a collection of containers that can run on a host. This resource is
created by clients and scheduled onto hosts.
FIELDS:
apiVersion <string>
APIVersion defines the versioned schema of this representation of an
object. Servers should convert recognized schemas to the latest internal
value, and may reject unrecognized values. More info:
https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources
kind <string>
Kind is a string value representing the REST resource this object
represents. Servers may infer this from the endpoint the client submits
requests to. Cannot be updated. In CamelCase. More info:
https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
metadata <Object>
Standard object's metadata. More info:
https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata
spec <Object>
Specification of the desired behavior of the pod. More info:
https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status
status <Object>
Most recently observed status of the pod. This data may not be up to date.
Populated by the system. Read-only. More info:
https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status
edit
编辑资源
//运行一个pod类型的nginx,名字叫nginx,内型是deployment
[root@master ~]# kubectl create deployment nginx --image nginx
deployment.apps/nginx created
[root@master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-6799fc88d8-7wp8w 1/1 Running 0 24s
[root@master ~]# kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
nginx 1/1 1 1 28s
//使用edit命令编辑
[root@master ~]# kubectl edit deployment nginx
......
kind: Deployment
metadata:
annotations:
deployment.kubernetes.io/revision: "1"
creationTimestamp: "2021-12-20T10:33:49Z"
generation: 1
labels:
app: test #修改为test
name: jj #添加name: jj
.....
//查看
[root@master ~]# kubectl describe deploy nginx
Name: nginx
Namespace: default
CreationTimestamp: Tue, 21 Dec 2021 01:18:37 +0800
Labels: app=test #可添加或修改
name=jj
Annotations: deployment.kubernetes.io/revision: 1
Selector: app=nginx
Replicas: 1 desired | 1 updated | 1 total | 1 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app=nginx
Containers:
nginx:
Image: nginx
Port: <none>
Host Port: <none>
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
Progressing True NewReplicaSetAvailable
OldReplicaSets: <none>
NewReplicaSet: nginx-6799fc88d8 (1/1 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 2m51s deployment-controller Scaled up replica set nginx-6799fc88d8 to 1
scale
动态扩展
//使用scale扩展
[root@master ~]# kubectl scale deployment/nginx --replicas 3
deployment.apps/nginx scaled
//扩展后查看多了几个相同类型的pod
[root@master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-6799fc88d8-7wp8w 1/1 Running 0 3m56s
nginx-6799fc88d8-jxq2b 1/1 Running 0 18s
nginx-6799fc88d8-mk2tl 1/1 Running 0 18s
[root@master ~]# kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
nginx 3/3 3 3 4m3s
//如果只需要2个deployment类型的nginx的pod
[root@master ~]# kubectl scale deployment/nginx --replicas 2
deployment.apps/nginx scaled
[root@master ~]# kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
nginx 2/2 2 2 4m24s
//查看发现只有两个(删除是随机的)
[root@master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-6799fc88d8-7wp8w 1/1 Running 0 4m27s
nginx-6799fc88d8-mk2tl 1/1 Running 0 49s
autoscale
自动扩展,给定一个范围,自动根据业务的访问量增加或减少
//最少3个,当不满足条件时会自动创建
[root@master ~]# kubectl autoscale deployment/nginx --min 3 --max=5
horizontalpodautoscaler.autoscaling/nginx autoscaled
[root@master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-6799fc88d8-27zww 0/1 ContainerCreating 0 0s
nginx-6799fc88d8-7wp8w 1/1 Running 0 5m28s
nginx-6799fc88d8-mk2tl 1/1 Running 0 110s
//当大于5个时,先创建,之后也会随机删除,直到满足条件五个
[root@master ~]# kubectl scale deployment/nginx --replicas 7
deployment.apps/nginx scaled
[root@master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-6799fc88d8-27zww 1/1 Running 0 40s
nginx-6799fc88d8-7wp8w 1/1 Running 0 6m8s
nginx-6799fc88d8-dkvsg 0/1 ContainerCreating 0 4s
nginx-6799fc88d8-hzvlm 0/1 ContainerCreating 0 4s
nginx-6799fc88d8-jk56n 0/1 ContainerCreating 0 4s
nginx-6799fc88d8-mk2tl 1/1 Running 0 2m30s
[root@master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-6799fc88d8-27zww 1/1 Running 0 47s
nginx-6799fc88d8-7wp8w 1/1 Running 0 6m15s
nginx-6799fc88d8-dkvsg 0/1 Terminating 0 11s
nginx-6799fc88d8-hzvlm 1/1 Running 0 11s
nginx-6799fc88d8-jk56n 0/1 ContainerCreating 0 11s
nginx-6799fc88d8-mk2tl 1/1 Running 0 2m37s
cluster-info
显示集群信息
[root@master ~]# kubectl cluster-info
Kubernetes control plane is running at https://192.168.47.115:6443
KubeDNS is running at https://192.168.47.115:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
cordon
可调度
[root@master ~]# kubectl cordon node2
node/node2 already cordoned
[root@master ~]# kubectl cordon node2
node/node2 cordoned
[root@master ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
master Ready control-plane,master 2d23h v1.20.0
node1 Ready <none> 2d23h v1.20.0
node2 Ready,SchedulingDisabled <none> 2d23h v1.20.0
[root@master ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-6799fc88d8-27zww 1/1 Running 0 2m6s 10.244.1.21 node1 <none> <none>
nginx-6799fc88d8-7wp8w 1/1 Running 0 7m34s 10.244.1.19 node1 <none> <none>
nginx-6799fc88d8-hzvlm 1/1 Running 0 90s 10.244.1.22 node1 <none> <none>
nginx-6799fc88d8-jk56n 1/1 Running 0 90s 10.244.2.13 node2 <none> <none>
nginx-6799fc88d8-mk2tl 1/1 Running 0 3m56s 10.244.2.11 node2 <none> <none>
[root@master ~]# kubectl scale deployment/nginx --replicas 2
[root@master ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-6799fc88d8-27zww 0/1 Terminating 0 2m27s 10.244.1.21 node1 <none> <none>
nginx-6799fc88d8-7wp8w 0/1 Terminating 0 7m55s 10.244.1.19 node1 <none> <none>
nginx-6799fc88d8-hzvlm 0/1 Terminating 0 111s 10.244.1.22 node1 <none> <none>
nginx-6799fc88d8-jk56n 1/1 Running 0 111s 10.244.2.13 node2 <none> <none>
nginx-6799fc88d8-mk2tl 1/1 Running 0 4m17s 10.244.2.11 node2 <none> <none>
uncordon
不可调度
[root@master ~]# kubectl uncordon node2
node/node2 uncordoned
[root@master ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
master Ready control-plane,master 2d23h v1.20.0
node1 Ready <none> 2d23h v1.20.0
node2 Ready <none> 2d23h v1.20.0
[root@master ~]# kubectl create deployment nginx2 --image nginx
deployment.apps/nginx2 created
[root@master ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-6799fc88d8-jk56n 1/1 Running 0 3m56s 10.244.2.13 node2 <none> <none>
nginx-6799fc88d8-kp8vf 1/1 Running 0 2m 10.244.1.23 node1 <none> <none>
nginx-6799fc88d8-mk2tl 1/1 Running 0 6m22s 10.244.2.11 node2 <none> <none>
nginx2-5fc4444698-f22tb 1/1 Running 0 32s 10.244.1.24 node1 <none> <none>
describe
显示指定pod的详细信息
[root@master ~]# kubectl describe pod nginx
Name: nginx-6799fc88d8-jk56n
Namespace: default
Priority: 0
Node: node2/192.168.47.121
Start Time: Tue, 21 Dec 2021 01:24:41 +0800
Labels: app=nginx
pod-template-hash=6799fc88d8
Annotations: <none>
Status: Running
IP: 10.244.2.13
IPs:
IP: 10.244.2.13
Controlled By: ReplicaSet/nginx-6799fc88d8
Containers:
nginx:
Container ID: docker://4b7f630e06232bdfa7c862f3937a6e1256ae3c023644c28c6089961ac9b6c738
Image: nginx
Image ID: docker-pullable://nginx@sha256:9522864dd661dcadfd9958f9e0de192a1fdda2c162a35668ab6ac42b465f0603
Port: <none>
Host Port: <none>
State: Running
Started: Tue, 21 Dec 2021 01:25:13 +0800
Ready: True
Restart Count: 0
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-mrc8p (ro)
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
default-token-mrc8p:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-mrc8p
Optional: false
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 4m46s default-scheduler Successfully assigned default/nginx-6799fc88d8-jk56n to node2
Normal Pulling 4m46s kubelet Pulling image "nginx"
Normal Pulled 4m15s kubelet Successfully pulled image "nginx" in 31.002882533s
Normal Created 4m15s kubelet Created container nginx
Normal Started 4m15s kubelet Started container nginx
·····
logs
查看日志
[root@master ~]# kubectl logs deployment/nginx
Found 3 pods, using pod/nginx-6799fc88d8-mk2tl
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
2021/12/20 17:22:17 [notice] 1#1: using the "epoll" event method
2021/12/20 17:22:17 [notice] 1#1: nginx/1.21.4
2021/12/20 17:22:17 [notice] 1#1: built by gcc 10.2.1 20210110 (Debian 10.2.1-6)
2021/12/20 17:22:17 [notice] 1#1: OS: Linux 4.18.0-193.el8.x86_64
2021/12/20 17:22:17 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2021/12/20 17:22:17 [notice] 1#1: start worker processes
2021/12/20 17:22:17 [notice] 1#1: start worker process 32
2021/12/20 17:22:17 [notice] 1#1: start worker process 33
[root@master ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 2d4h
nginx ClusterIP 10.102.213.63 <none> 8080/TCP 24h
[root@master ~]# curl 10.102.213.63:8080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
[root@master ~]# kubectl logs deployment/nginx
......
2021/12/20 12:44:49 [notice] 1#1: start worker processes
2021/12/20 12:44:49 [notice] 1#1: start worker process 31
2021/12/20 12:44:49 [notice] 1#1: start worker process 32
10.244.0.0 - - [20/Dec/2021:13:04:14 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.61.1" "-"
10.244.0.0 - - [20/Dec/2021:13:05:26 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.61.1" "-"
attach
附加在一个容器里
[root@master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-6799fc88d8-cpbg4 1/1 Running 0 43m
nginx-6799fc88d8-plvhf 1/1 Running 0 6m38s
nginx-6799fc88d8-rf74m 1/1 Running 0 8m57s
[root@master ~]# kubectl attach nginx-6799fc88d8-jk56n
Defaulting container name to nginx.
Use 'kubectl describe pod/nginx-6799fc88d8-jk56n -n default' to see all of the containers in this pod.
If you don't see a command prompt, try pressing enter.
[root@master ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-6799fc88d8-jk56n 1/1 Running 0 7m49s 10.244.2.13 node2 <none> <none>
nginx-6799fc88d8-kp8vf 1/1 Running 0 5m53s 10.244.1.23 node1 <none> <none>
nginx-6799fc88d8-mk2tl 1/1 Running 0 10m 10.244.2.11 node2 <none> <none>
nginx2-5fc4444698-f22tb 1/1 Running 0 4m25s 10.244.1.24 node1 <none> <none>
[root@master ~]# curl http://10.244.2.13
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
#新增访问日志信息,<ctrl>+c退出,容器不会终止
[root@master ~]# kubectl attach nginx-6799fc88d8-jk56n
Defaulting container name to nginx.
Use 'kubectl describe pod/nginx-6799fc88d8-jk56n -n default' to see all of the containers in this pod.
If you don't see a command prompt, try pressing enter.
10.244.0.0 - - [20/Dec/2021:17:32:58 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.61.1" "-"
^C
[root@master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-6799fc88d8-jk56n 1/1 Running 0 8m59s
nginx-6799fc88d8-kp8vf 1/1 Running 0 7m3s
nginx-6799fc88d8-mk2tl 1/1 Running 0 11m
nginx2-5fc4444698-f22tb 1/1 Running 0 5m35s
exec
执行容器命令
[root@master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-6799fc88d8-jk56n 1/1 Running 0 10m
[root@master ~]# kubectl exec nginx-6799fc88d8-jk56n -- date
Mon Dec 20 17:35:29 UTC 2021
[root@master ~]# kubectl exec -it nginx-6799fc88d8-jk56n -- /bin/sh
# ls
bin dev docker-entrypoint.sh home lib64 mnt proc run srv tmp var
boot docker-entrypoint.d etc lib media opt root sbin sys usr
# exit
[root@master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-6799fc88d8-jk56n 1/1 Running 0 11m
prot-forward
转发一个或多个端口到pod里面去
[root@master ~]# kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
nginx2 1/1 1 1 11m
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx2-5fc4444698-f22tb 1/1 Running 0 11m
[root@master ~]# kubectl port-forward deployment/nginx2 80
Forwarding from 127.0.0.1:80 -> 80
Forwarding from [::1]:80 -> 80
#可以变成':80'(随机一个端口号,只能本机访问)或者变成指定的端口号'8080:80'(本机访问用80,其它主机访问就可以用8080)
Forwarding from 127.0.0.1:80 -> 80
Forwarding from [::1]:80 -> 80
[root@master ~]# ss -anlt
State Recv-Q Send-Q Local Address:Port Peer Address:Port
...... 0.0.0.0:*
LISTEN 0 128 127.0.0.1:2381 0.0.0.0:*
LISTEN 0 128 127.0.0.1:80 0.0.0.0:*
[root@master ~]# curl 127.0.0.1
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
[root@master ~]# kubectl port-forward --address 0.0.0.0 deployment/nginx2 80
Forwarding from 0.0.0.0:80 -> 80
//允许所有IP访问80端口
[root@master ~]# curl 127.0.0.1
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
cp
复制
拷贝文件或目录到容器中,或者从容器内向外拷贝
[root@master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx2-5fc4444698-f22tb 1/1 Running 0 14m
[root@master ~]# ls
anaconda-ks.cfg init
[root@master ~]# kubectl cp /root/init nginx2-5fc4444698-f22tb:/tmp
[root@master ~]# kubectl exec nginx2-5fc4444698-f22tb -- ls -l /tmp
total 4
-rw-r--r-- 1 root root 174 Dec 20 17:43 init
label
标签
给资源设置、更新标签
[root@master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx2-5fc4444698-f22tb 1/1 Running 0 17m
[root@master ~]# kubectl describe pod nginx2
Name: nginx2-5fc4444698-f22tb
Namespace: default
Priority: 0
Node: node1/192.168.47.120
Start Time: Tue, 21 Dec 2021 01:28:05 +0800
Labels: app=nginx2
pod-template-hash=5fc4444698
.....
//追加标签
[root@master ~]# kubectl label pods nginx2-5fc4444698-f22tb name=test
pod/nginx2-5fc4444698-f22tb labeled
[root@master ~]# kubectl describe pod nginx2-5fc4444698-f22tb
Name: nginx2-5fc4444698-f22tb
Namespace: default
Priority: 0
Node: node1/192.168.47.120
Start Time: Tue, 21 Dec 2021 01:28:05 +0800
Labels: app=nginx2
name=test
pod-template-hash=5fc4444698
Annotations: <none>
//更改标签
[root@master ~]# kubectl label --overwrite pods nginx2-5fc4444698-f22tb app=test
pod/nginx labeled
//查看是否更改成功
[root@master ~]# kubectl describe pod nginx2-5fc4444698-f22tb
Name: nginx2-5fc4444698-f22tb
Namespace: default
Priority: 0
Node: node1/192.168.47.120
Start Time: Tue, 21 Dec 2021 01:28:05 +0800
Labels: app=test
name=test
pod-template-hash=5fc4444698
api-resources
查看所有资源
[root@master ~]# kubectl api-resources
NAME SHORTNAMES APIVERSION NAMESPACED KIND
bindings v1 true Binding
componentstatuses cs v1 false ComponentStatus
configmaps cm v1 true ConfigMap
endpoints ep v1 true Endpoints
events ev v1 true Event
limitranges limits v1 true LimitRange
namespaces ns v1 false Namespace
nodes no v1 false Node
......
api-versions
API版本
[root@master ~]# kubectl api-versions
admissionregistration.k8s.io/v1
admissionregistration.k8s.io/v1beta1
apiextensions.k8s.io/v1
apiextensions.k8s.io/v1beta1
apiregistration.k8s.io/v1
apiregistration.k8s.io/v1beta1
apps/v1
authentication.k8s.io/v1
authentication.k8s.io/v1beta1
authorization.k8s.io/v1
authorization.k8s.io/v1beta1
autoscaling/v1
autoscaling/v2beta1
autoscaling/v2beta2
batch/v1
batch/v1beta1
certificates.k8s.io/v1
certificates.k8s.io/v1beta1
coordination.k8s.io/v1
coordination.k8s.io/v1beta1
discovery.k8s.io/v1beta1
events.k8s.io/v1
events.k8s.io/v1beta1
extensions/v1beta1
flowcontrol.apiserver.k8s.io/v1beta1
networking.k8s.io/v1
networking.k8s.io/v1beta1
node.k8s.io/v1
node.k8s.io/v1beta1
policy/v1beta1
rbac.authorization.k8s.io/v1
rbac.authorization.k8s.io/v1beta1
scheduling.k8s.io/v1
scheduling.k8s.io/v1beta1
storage.k8s.io/v1
storage.k8s.io/v1beta1
v1
version
查看版本
[root@master ~]# kubectl version
Client Version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.0", GitCommit:"af46c47ce925f4c4ad5cc8d1fca46c7b77d13b38", GitTreeState:"clean", BuildDate:"2020-12-08T17:59:43Z", GoVersion:"go1.15.5", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.0", GitCommit:"af46c47ce925f4c4ad5cc8d1fca46c7b77d13b38", GitTreeState:"clean", BuildDate:"2020-12-08T17:51:19Z", GoVersion:"go1.15.5", Compiler:"gc", Platform:"linux/amd64"}
使用deploument控制器部署镜像
[root@master ~]# kubectl create deployment nginx --image lizhenliang/java-demo
deployment.apps/nginx created
[root@master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-5fd5cdd7d4-4sjb7 1/1 Running 0 3m30s
nginx-5fd5cdd7d4-nq9bb 1/1 Running 0 3m30s
nginx-5fd5cdd7d4-p97tp 1/1 Running 0 3m45s
[root@master ~]# kubectl get deploy,pods
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/nginx 1/3 3 1 38s
NAME READY STATUS RESTARTS AGE
pod/nginx-5fd5cdd7d4-4sjb7 1/1 Running 0 3m59s
pod/nginx-5fd5cdd7d4-nq9bb 1/1 Running 0 3m59s
pod/nginx-5fd5cdd7d4-p97tp 1/1 Running 0 4m14s
//使用Service将pod暴露出去
[root@master ~]# kubectl expose deployment nginx --port=80 --target-port=8080 --type=NodePort
service/nginx exposed
[root@master ~]# kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 2d6h
nginx NodePort 10.111.209.122 <none> 80:32603/TCP 8s
//访问
[root@master ~]# curl 192.168.129.250:32603
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>把美女带回家应用案例</title>
<meta name="description" content="把美女带回家应用案例">
<meta name="keywords" content="index">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta http-equiv="Cache-Control" content="no-siteapp" />
<link rel="stylesheet" href="../js/layui/css/layui.css" media="all">
<link rel="stylesheet" href="../css/reset.css">
<link rel="stylesheet" href="../css/supersized.css">
<link rel="stylesheet" href="../css/style.css">
<link rel="stylesheet" href="../css/typeit.css">
<link rel="stylesheet" href="../css/date.css">
</head>
<body>
<!-- <img src="../images/logo.png"> -->
<div class="page-container">
<h1 class="title"></h1>
<div style="margin-top: 15%;">
<button class="layui-btn layui-btn-lg layui-btn-primary layui-btn-radius" onclick="adduser()">添加美女</button>
<button class="layui-btn layui-btn-lg layui-btn-primary layui-btn-radius" onclick="queryuserList()">今晚翻盘哪个</button>
</div>
<!-- <div style="text-align:center;clear:both" class="date">
</div> -->
<!-- <div class="connect">
<p>联系作者:子彬</p>
<p>
<a class="qq" target="_blank" href="http://wpa.qq.com/msgrd?Menu=no&Exe=QQ&Uin=125720240"></a>
<a class="twitter" href=""></a>
</p>
</div> -->
</div>
<script src="../js/jquery-1.8.2.min.js"></script>
<script src="../js/layui/layui.js"></script>
<script src="../js/supersized.3.2.7.min.js"></script>
<script src="../js/supersized-init.js"></script>
<script src="../js/typeit.js"></script>
<script src="../js/date.js"></script>
<script src="../js/index.js"></script>
<script type="text/javascript">
$('.title').typeIt({
whatToType: "这里有很多美女,挑一个回家吧!",
typeSpeed: 300,
lifeLike: true,
breakLines :true
}, function() {
console.log('This is tomcat callback function!');
});
</script>
</body>
</html>
滚动更新、回滚
用Dockerfile编写两个镜像
[root@master ~]# mkdir httpd
[root@master ~]# cd httpd/
//制作第一版镜像
[root@master httpd]# vim Dockerfile
[root@master httpd]# cat Dockerfile
FROM busybox
RUN mkdir /data && \
echo "test page on v1" > /data/index.html
ENTRYPOINT ["/bin/httpd","-f","-h","/data"]
[root@master httpd]# docker build -t jiejiehao/httpd:v1 .
Sending build context to Docker daemon 2.048kB
Step 1/3 : FROM busybox
---> ffe9d497c324
Step 2/3 : RUN mkdir /data && echo "test page on v1" > /data/index.html
---> Running in 0753a276c632
Removing intermediate container 0753a276c632
---> 75825bd6a4d5
Step 3/3 : ENTRYPOINT ["/bin/httpd","-f","-h","/data"]
---> Running in af4ecc493da0
Removing intermediate container af4ecc493da0
---> 477d3c5c8fe7
Successfully built 477d3c5c8fe7
Successfully tagged jiejiehao/httpd:v1
//制作第二版镜像
[root@master httpd]# vim Dockerfile
[root@master httpd]# cat Dockerfile
FROM busybox
RUN mkdir /data && \
echo "test page on v2" > /data/index.html
ENTRYPOINT ["/bin/httpd","-f","-h","/data"]
[root@master httpd]# docker build -t jiejiehao/httpd:v2 .
Sending build context to Docker daemon 2.048kB
Step 1/3 : FROM busybox
---> ffe9d497c324
Step 2/3 : RUN mkdir /data && echo "test page on v2" > /data/index.html
---> Running in c6a32c0067e4
Removing intermediate container c6a32c0067e4
---> 6d1103c3febc
Step 3/3 : ENTRYPOINT ["/bin/httpd","-f","-h","/data"]
---> Running in e24dd849a599
Removing intermediate container e24dd849a599
---> 7236b2280632
Successfully built 7236b2280632
Successfully tagged jiejiehao/httpd:v2
[root@master httpd]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
jiejiehao/httpd v1 477d3c5c8fe7 39 seconds ago 1.24MB
jiejiehao/httpd v2 7236b2280632 54 seconds ago 1.24MB
busybox latest ffe9d497c324 12 days ago 1.24MB
[root@master ~]# docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: jiejiehao
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
[root@master ~]# docker push jiejiehao/httpd:v1
The push refers to repository [docker.io/jiejiehao/httpd]
222718935aad: Pushed
64cac9eaf0da: Mounted from library/busybox
v1: digest: sha256:1ae146ca01daf76043ccad9cb5ece9eaede66ceaa2fdf9c1afdb29fcaa95ba7c size: 734
[root@master ~]# docker push jiejiehao/httpd:v2
The push refers to repository [docker.io/jiejiehao/httpd]
d59d343cf27e: Layer already exists
64cac9eaf0da: Layer already exists
v2: digest: sha256:ccb39d6e8db89e89efff912164ed1c309c98ea363b75c54c74afbfbd1530eb60 size: 734
滚动更新、回滚
//用k8s基于httpd:v1镜像运行镜像3个pod
[root@master httpd]# kubectl create deploy httpd --image jiejiehao/httpd:v1 --replicas 3
deployment.apps/httpd created
[root@master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
httpd-7649d9b878-5lvf7 1/1 Running 0 8m4s
httpd-7649d9b878-ck6cq 1/1 Running 0 8m4s
httpd-7649d9b878-pkqkk 1/1 Running 0 8m4s
#暴露端口号
[root@master ~]# kubectl expose deploy httpd --port 80 --type NodePort
service/httpd exposed
[root@master ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
httpd NodePort 10.103.50.196 <none> 80:30263/TCP 37s
#访问
[root@master ~]# curl 10.103.50.196
test page on v1
[root@master ~]# curl 192.168.47.115:30263
test page on v1
//更新
[root@master ~]# kubectl set image deploy/httpd httpd=jiejiehao/httpd:v2
deployment.apps/httpd image updated
//创建一个新pod,删除一个旧pod。直到更新完成
[root@master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
httpd-7649d9b878-5lvf7 1/1 Terminating 0 11m
httpd-7649d9b878-ck6cq 1/1 Running 0 11m
httpd-7649d9b878-pkqkk 1/1 Terminating 0 11m
httpd-cb9c79f99-gfk9z 0/1 ContainerCreating 0 10s
httpd-cb9c79f99-w722f 1/1 Running 0 11s
httpd-cb9c79f99-zcsw5 1/1 Running 0 35s
[root@master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
httpd-cb9c79f99-gfk9z 1/1 Running 0 101s
httpd-cb9c79f99-w722f 1/1 Running 0 102s
httpd-cb9c79f99-zcsw5 1/1 Running 0 2m6s
#访问
[root@master ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
httpd NodePort 10.103.50.196 <none> 80:30263/TCP 5m13s
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3d
[root@master ~]# curl 10.103.50.196
test page on v2
[root@master ~]# curl 192.168.47.115:30263
test page on v2
//回滚
[root@master ~]# kubectl rollout undo deploy/httpd
deployment.apps/httpd rolled back
[root@master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
httpd-7649d9b878-96cnm 1/1 Running 0 8s
httpd-7649d9b878-mq6mh 1/1 Running 0 6s
httpd-7649d9b878-rtmjt 1/1 Running 0 10s
httpd-cb9c79f99-gfk9z 1/1 Terminating 0 3m21s
httpd-cb9c79f99-w722f 1/1 Terminating 0 3m22s
httpd-cb9c79f99-zcsw5 1/1 Terminating 0 3m46s
[root@master ~]# curl 10.103.50.196
test page on v1
[root@master ~]# curl 192.168.47.115:30263
test page on v1
//创建v3版本
[root@master httpd]# vim Dockerfile
[root@master httpd]# cat Dockerfile
FROM busybox
RUN mkdir /data && \
echo "test page on v3" > /data/index.html
ENTRYPOINT ["/bin/httpd","-f","-h","/data"]
[root@master httpd]# docker build -t jiejiehao/httpd:v3 .
Sending build context to Docker daemon 2.048kB
Step 1/3 : FROM busybox
---> ffe9d497c324
Step 2/3 : RUN mkdir /data && echo "test page on v3" > /data/index.html
---> Running in 8ea936e6629c
Removing intermediate container 8ea936e6629c
---> a827c5b321f9
Step 3/3 : ENTRYPOINT ["/bin/httpd","-f","-h","/data"]
---> Running in 216b3ba59275
Removing intermediate container 216b3ba59275
---> 9777e0dbeee8
Successfully built 9777e0dbeee8
Successfully tagged jiejiehao/httpd:v3
[root@master httpd]# docker push jiejiehao/httpd:v3
The push refers to repository [docker.io/jiejiehao/httpd]
c05cffd8f41f: Pushed
64cac9eaf0da: Layer already exists
v3: digest: sha256:c27534074bae54cbf36e91e1161cc009465e4cc57b2ebf90a9edef2524bf6f12 size: 734
[root@master httpd]# kubectl set image deploy/httpd httpd=jiejiehao/httpd:v3
deployment.apps/httpd image updated
//现在属于v1,上一版本是v2
[root@master ~]# curl 10.103.50.196
test page on v1
//更新版本至v3
[root@master httpd]# kubectl set image deploy/httpd httpd=jiejiehao/httpd:v3
deployment.apps/httpd image updated
[root@master httpd]# curl 10.103.50.196
test page on v3
//回滚
[root@master ~]# kubectl rollout undo deploy/httpd
deployment.apps/httpd rolled back
//回到v1
[root@master ~]# curl 10.103.50.196
test page on v1
//再次回滚
[root@master ~]# kubectl rollout undo deploy/httpd
deployment.apps/httpd rolled back
//发现回到了v3,并没有回到v2
//说明回滚到之前的版本也算一次版本记录,所以最多只能回滚一次
[root@master ~]# curl 10.103.50.196
test page on v3