環境:k8s v1.18.5
網絡環境: calico,通過nodePort方式對外提供nginx服務
一、 創建nginx的service
1.定義nginx的service(nginx-service.yml)
apiVersion: v1
kind: Service
metadata:
name: nginx-service #定義service名稱為nginx-service
labels:
app: nginx-service #為service打上app標簽
spec:
type: NodePort #使用NodePort方式開通,在每個Node上分配一個端口作為外部訪問入口
selector:
app: my-nginx
ports:
- port: 8000 #port是k8s集群內部訪問service的端口,即通過clusterIP: port可以訪問到某個service
targetPort: 80 #targetPort是pod的端口,從port和nodePort來的流量經過kube-proxy流入到后端pod的targetPort上,最后進入容器
nodePort: 32500 #nodePort是外部訪問k8s集群中service的端口,通過nodeIP: nodePort可以從外部訪問到某個service
端口type類型:
• ClusterIP:默認,分配一個集群內部可以訪問的虛擬IP(VIP)
• NodePort:在每個Node上分配一個端口作為外部訪問入口
• LoadBalancer:工作在特定的Cloud Provider上,例如Google Cloud,AWS,OpenStack
2.創建nginx-service服務
kubectl create -f nginx-service.yml
3.驗證服務是否創建成功
kubectl get svc
二、創建ngixn的configmap配置文件(nginx-configmap.yml)
1.定義nginx的configmap配置
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-configmap
data:
nginx_conf: |-
#user nobody;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
2.創建nginx-configmap
kubectl create -f nginx-configmap.yml
3.驗證是否創建成功
kubectl get cm
三、創建nginx的deployment
1.定義nginx的deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-nginx
spec:
selector:
matchLabels:
app: my-nginx
replicas: 2
template:
metadata:
labels:
app: my-nginx
spec:
containers:
- name: my-nginx
image: nginx
ports:
- containerPort: 80
volumeMounts:
- mountPath: /etc/nginx/nginx.conf
name: nginx
subPath: nginx.conf
volumes:
- name: nginx
configMap:
name: nginx-configmap
items:
- key: nginx_conf
path: nginx.conf
#resources:
# requests:
# cpu: 1
# memory: 500Mi
# limits:
# cpu: 2
# memory: 1024Mi
2.創建nginx的deployment
kubectl create -f nginx-deployment.yml
3.驗證deployment是否創建成功
kubectl get deploy
my-nginx就是創建的deploy,但是ready狀態是0,證明pod為能成功創建。后面排查發現,pod一直卡在了容器創建階段
4.驗證deployment對應的pod是否創建成功
kubectl get pod
容器一直卡在容器創建階段,需排查問題。
通過查看某個容器的詳細信息,發現是nginx的configmap的問題:
kubectl describe pod my-nginx-65b859bc7b-qvh2t
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 10m default-scheduler Successfully assigned default/my-nginx-546db9c8f7-wxtzl to k8s-slave1
Normal SandboxChanged 8m34s (x3 over 8m41s) kubelet, k8s-slave1 Pod sandbox changed, it will be killed and re-created.
Normal Pulling 6m36s (x3 over 10m) kubelet, k8s-slave1 Pulling image "nginx"
Warning Failed 5m20s (x3 over 8m41s) kubelet, k8s-slave1 Failed to pull image "nginx": rpc error: code = Unknown desc = context canceled
Warning Failed 5m20s (x3 over 8m41s) kubelet, k8s-slave1 Error: ErrImagePull
Warning Failed 4m44s (x7 over 8m38s) kubelet, k8s-slave1 Error: ImagePullBackOff
Normal BackOff 2s (x14 over 8m38s) kubelet, k8s-slave1 Back-off pulling image "nginx"
原因:拉取nginx的鏡像失敗
解決方法:手動通過docker pull nginx 拉一次鏡像下來。若手動拉取也一直卡住,則嘗試重啟node節點主機(因為我是在虛擬機上搭建的,所以可以隨意重啟,哈哈)
5.驗證nginx是否正常提供服務

5.2 在k8s集群環境,通過clusterIp訪問
因為安裝了calico,所以可以直接在所有節點機器上執行該操作
5.3 通過podIP(當前其中一個nginx pod ip為192.168.92.52,另一個是192.168.0.100)訪問
