1、创建一个 nginx 的 pod
定义了一个 nginx.yaml 的文件:
[root@kube-node01 yaml]$ cat pod_nginx.yml
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
其中定义了版本,类型,名称,镜像,端口等等。
现在来启动它:
[root@kube-node01 yaml]$ kubectl create -f pod_nginx.yml
pod "nginx" created
简单查看一下状态:
[root@kube-node01 yaml]$ kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 25s
可以看到命名为 nginx 的 pod 起来了,1/1 表示只有一个
查看详细状态:
[root@kube-node01 yaml]$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
nginx 1/1 Running 0 1m 172.30.64.2 kube-node01
可以观察到 pod 的 ip(172.30.64.2),以及所被分配到的节点(kube-node01)
2、进入到 pod
进入到 pod 方式以下方法:
[root@kube-node01 yaml]$ kubectl exec -it nginx bash
root@nginx:/# ls
bin dev home lib64 mnt proc run srv tmp var
boot etc lib media opt root sbin sys usr
这样以来就直接进入到 pod 对应的容器里边来了,如果这个 pod 里边含有多个容器,那么默认是进入到第一个容器当中。如果想要进入到其他容器,那么看下命令帮助信息:
[root@kube-node01 yaml]$ kubectl exec --help
在容器中执行命令。
例子:
#默认情况下,使用第一个容器从pod 123456-7890中运行'date'输出
kubectl exec 123456-7890 date
#从pod 123456-7890获取ruby-container中运行'date'的输出
kubectl exec 123456-7890 -cruby-container日期
#切换到原始终端模式,将stdin发送到pod 123456-7890的ruby-container中的'bash'
#并将stdout / stderr从'bash'发送回客户端
kubectl exec 123456-7890 -c ruby-container -i -t - bash -il
#从pod 123456-7890的第一个容器中列出/ usr的内容,并按修改时间排序。
#如果要在pod中执行的命令有任何共同的标志(例如-i),
#您必须使用两个破折号( - )来分隔命令的标志/参数。
#另请注意,不要用引号括起命令及其flags / arguments
#除非你正常执行它(即,执行ls -t / usr,而不是“ls -t / usr”)。
kubectl exec 123456-7890 -i -t - ls -t / usr
选项:
-c, - container ='':容器名称。如果省略,将选择pod中的第一个容器
-p, - pod ='':Pod名称
-i, - stdin = false:将stdin传递给容器
-t, - t = false:Stdin是TTY
用法:
kubectl exec POD [-c CONTAINER] - COMMAND [args ...] [options]
使用“kubectl options”获取全局命令行选项列表(适用于所有命令)。
可以通过-c的选项进行指定。
3、查看 pod 详细信息
Name: nginx-hntgc
Namespace: default
Node: kube-node01/IP地址
Start Time: Tue, 14 Sep 2021 16:01:44 +0800
Labels: app=nginx
Annotations: <none>
Status: Running
IP: 172.30.64.2
Controlled By: ReplicationController/nginx
Containers:
nginx:
Container ID: docker://87fe5e6147db509f3655c7c61f751ff96232c399e121ace4c09b5aad42db2378
Image: nginx
Image ID: docker-pullable://nginx@sha256:853b221d3341add7aaadf5f81dd088ea943ab9c918766e295321294b035f3f3e
Port: 80/TCP
Host Port: 0/TCP
State: Running
Started: Tue, 14 Sep 2021 XX:XX:XX +0800
Ready: True
Restart Count: 0
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-sq2n9 (ro)
Conditions:
Type Status
Initialized True
Ready True
PodScheduled True
Volumes:
default-token-sq2n9:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-sq2n9
Optional: false
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s
node.kubernetes.io/unreachable:NoExecute for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 19m default-scheduler Successfully assigned nginx-hntgc to kube-node01
Normal SuccessfulMountVolume 19m kubelet, kube-node01 MountVolume.SetUp succeeded for volume "default-token-sq2n9"
Normal Pulling 19m kubelet, kube-node01 pulling image "nginx"
Normal Pulled 19m kubelet, kube-node01 Successfully pulled image "nginx"
Normal Created 19m kubelet, kube-node01 Created container
Normal Started 19m kubelet, kube-node01 Started container
4、测试访问 pod 地址
现在看到这个 pod 在集群中的 ip 是172.30.64.2,那么我们访问一下
[root@kube-node01 yaml]$ curl 172.30.64.2
<!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>
发现在集群当中访问都是可以的,但是我们这个 nginx 部署之后,是想要让外部人员能够访问的,那么这个时候就要用的 kubectl 的port-forward了。
先看看介绍:
[root@kube-node01 yaml]$ kubectl port-forward --help
将一个或多个本地端口转发到pod。
使用资源类型/名称(例如deployment / mydeployment)来选择pod。如果省略,资源类型默认为“pod”。
如果有多个符合条件的广告连播,则会自动选择广告连播。转发会话结束时
选定的pod终止,并且需要重新运行该命令才能恢复转发。
例子:
#在本地侦听端口5000和6000,将数据转发到容器中的端口5000和6000
kubectl port-forward pod / mypod 5000 6000
#在本地侦听端口5000和6000,将数据转发到/从端口5000和6000中选择的端口
部署
kubectl port-forward deployment / mydeployment 5000 6000
#在本地端口8888上侦听,在pod中转发到5000
kubectl port-forward pod / mypod 8888:5000
#在本地随机端口收听,转发到pod中的5000
kubectl port-forward pod / mypod:5000
选项:
--pod-running-timeout = 1m0s:等待至少一个的时间长度(如5s,2m或3h,大于零)
pod正在运行
用法:
kubectl port-forward TYPE / NAME [LOCAL_PORT:] REMOTE_PORT [... [LOCAL_PORT_N:] REMOTE_PORT_N] [options]
使用“kubectl options”获取全局命令行选项列表(适用于所有命令)。
我们可以通过这个指令将 pod 里边的端口映射到主机上来,方法如下
[root@kube-node01 yaml]$ kubectl port-forward nginx 8080:80
Forwarding from 127.0.0.1:8080 -> 80
Forwarding from [::1]:8080 -> 80
将 pod 里边的 80 端口映射到主机的 8080 端口,那么现在去访问一下看看:
[root@master ~]$ curl 127.0.0.1:8080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
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>
发现已经可以了。但是刚刚那个映射的时候,可以看到映射输出在前台不会退出,而一旦退出之后,则这个映射又消失了,怎样才能恒久的映射呢,这个后边再说