kubernetes基本操作
kubernetes基本操作
执行两条命令,以支持kubectl
命令tables
补全
yum -y install bash-completion bash-completion-extras
kubectl completion bash >~/.kube/kubectl_autocompletion
echo 'source ~/.kube/kubectl_autocompletion' >>/etc/profile
source /etc/profile
kubectl命令行管理工具
用于连接kubernetes集群和管理资源的命令行工具
创建资源
kubectl run nginx --replicas=3 --image=nginx:latest --port=80
#参数
--replicas ---指定数量
--image ---指定镜像
--port ---指定端口
这个命令创建了一个控制器(deployment),这个控制器负责更高级的功能,譬如滚动更新,管理你的副本
kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
nginx 3/3 3 3 3m24s
发布服务
#服务不是创建好了就可以访问到的,需要创建一个service把你的服务暴露出去
kubectl expose deployment nginx --port=80 --type=NodePort --target-port=80 --name=nginx-serivce
#参数
deployment ---指定deployment名字,也就是刚刚创建的nginx
--port ---service内部访问的端口
--type=NodePort ---类型为NodePort,代表node节点IP
--target-port ---容器端口
--name ---service名字
kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 38h
nginx-serivce NodePort 10.0.0.147 <none> 80:31493/TCP 20s
nginx已经发布出去了,随机的端口为31493,所以访问任意Node节点的31493
for i in `echo 192.168.10.{92,93,95}:31493`;do curl -I $i;done
HTTP/1.1 200 OK
Server: nginx/1.17.10
Date: Wed, 27 May 2020 01:52:44 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 14 Apr 2020 14:19:26 GMT
Connection: keep-alive
ETag: "5e95c66e-264"
Accept-Ranges: bytes
HTTP/1.1 200 OK
Server: nginx/1.17.10
Date: Wed, 27 May 2020 01:52:44 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 14 Apr 2020 14:19:26 GMT
Connection: keep-alive
ETag: "5e95c66e-264"
Accept-Ranges: bytes
HTTP/1.1 200 OK
Server: nginx/1.17.10
Date: Wed, 27 May 2020 01:52:44 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 14 Apr 2020 14:19:26 GMT
Connection: keep-alive
ETag: "5e95c66e-264"
Accept-Ranges: bytes
更新服务
#把nginx版本更变为1.16.1
kubectl set image deployment/nginx nginx=nginx:1.16.1
#确认是否已经更新
for i in `echo 192.168.10.{92,93,95}:31493`;do curl -I $i;done
HTTP/1.1 200 OK
Server: nginx/1.16.1
Date: Wed, 27 May 2020 01:59:27 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 13 Aug 2019 10:05:00 GMT
Connection: keep-alive
ETag: "5d528b4c-264"
Accept-Ranges: bytes
HTTP/1.1 200 OK
Server: nginx/1.16.1
Date: Wed, 27 May 2020 01:59:27 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 13 Aug 2019 10:05:00 GMT
Connection: keep-alive
ETag: "5d528b4c-264"
Accept-Ranges: bytes
HTTP/1.1 200 OK
Server: nginx/1.16.1
Date: Wed, 27 May 2020 01:59:27 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 13 Aug 2019 10:05:00 GMT
Connection: keep-alive
ETag: "5d528b4c-264"
Accept-Ranges: bytes
服务回滚
#查看一下发布过的历史版本
kubectl rollout history deployment nginx
deployment.apps/nginx
REVISION CHANGE-CAUSE
1 <none>
2 <none>
#1就是第一次发布版本,2就是当前版本,要回滚一条命令就好了,指定回滚版本也可以
kubectl rollout undo deployment nginx
#确认是否已经更新
for i in `echo 192.168.10.{92,93,95}:31493`;do curl -I $i;done
HTTP/1.1 200 OK
Server: nginx/1.17.10
Date: Wed, 27 May 2020 02:10:57 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 14 Apr 2020 14:19:26 GMT
Connection: keep-alive
ETag: "5e95c66e-264"
Accept-Ranges: bytes
HTTP/1.1 200 OK
Server: nginx/1.17.10
Date: Wed, 27 May 2020 02:10:57 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 14 Apr 2020 14:19:26 GMT
Connection: keep-alive
ETag: "5e95c66e-264"
Accept-Ranges: bytes
HTTP/1.1 200 OK
Server: nginx/1.17.10
Date: Wed, 27 May 2020 02:10:57 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 14 Apr 2020 14:19:26 GMT
Connection: keep-alive
ETag: "5e95c66e-264"
Accept-Ranges: bytes
删除服务
#在部署时部署了两套资源,一套是deployment,一套是service,所以直接把两个删掉就行了
kubectl delete deployment nginx
kubectl delete services nginx-serivce
kubectl远程连接K8S集群
现在所有的管理都是在Master上进行操作的,kubectl离开了Master他就不行了,因为Master跑了apiserver,而apiserver现在监听的地址是127.0.0.1:8080,kubectl默认连接的apiserver的地址就是127.0.0.1:8080
netstat -lntp | grep kube-apiserver
tcp 0 0 192.168.10.91:6443 0.0.0.0:* LISTEN 1319/kube-apiserver
tcp 0 0 127.0.0.1:8080 0.0.0.0:* LISTEN 1319/kube-apiserver
想在别的非Master节点连接K8S集群,具体的方法是生成一个名为kubectl config的配置文件,这个配置文件包含了连接apiserver的认证信息
复制文件
ansible nodes -m copy -a "src=/opt/kubernetes/bin/kubectl dest=/usr/local/bin/ mode=755"
生成配置文件
#在Master节点操作
cat kubectl_Connection.sh
#bin/bash
#生成管理员证书
cd /opt/ssl_config/kubernetes/
cat > admin-csr.json<<EOF
{
"CN": "admin",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "BeiJing",
"ST": "BeiJing",
"O": "system:masters",
"OU": "System"
}
]
}
EOF
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes admin-csr.json | cfssljson -bare admin
#创建kubeconfig文件
# 设置集群参数
kubectl config set-cluster kubernetes \
--server=https://192.168.31.61:6443 \
--certificate-authority=ca.pem \
--embed-certs=true \
--kubeconfig=config
# 设置客户端认证参数
kubectl config set-credentials cluster-admin \
--certificate-authority=ca.pem \
--embed-certs=true \
--client-key=admin-key.pem \
--client-certificate=admin.pem \
--kubeconfig=config
# 设置上下文参数
kubectl config set-context default \
--cluster=kubernetes \
--user=cluster-admin \
--kubeconfig=config
# 设置默认上下文
kubectl config use-context default --kubeconfig=config
执行脚本
#执行脚本
bash kubectl_Connection.sh
测试能否正常连接
ansible nodes -m file -a "path=/root/.kube state=directory"
ansible nodes -m copy -a "src=config dest=/root/.kube/"
[root@k8s01 kubernetes]# ssh k8s02
[root@k8s02 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s02 Ready <none> 37h v1.16.10
k8s03 Ready <none> 36h v1.16.10
k8s05 Ready <none> 17h v1.16.10
[root@k8s02 ~]#
#如果你的配置文件没有传到~/.kube目录下,你需要使用--kubeconfig=指定文件位置
YAML配置文件资源管理
语法格式:
•缩进表示层级关系
•不支持制表符"tab"缩进,使用空格缩进
•通常开头缩进2 个空格
•字符后缩进1 个空格,如冒号、逗号等
•"---" 表示YAML格式,一个文件的开始
•"#"注释
使用YAML文件部署应用
[root@k8s01 yml]# cat deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
详解
#指定当前部署Deployment资源版本,在k8S中所有的资源对象都时通过api分组去实现的,这里指定的api版本
#v1表示这个资源组的稳定版本,beta为测试版,写YAML最好指定一个稳定版本。
apiVersion: apps/v1
#API版本很多的,可以通过如下命令查看
kubectl api-versions
#指定资源的名字,你要是用哪个资源
kind: Deployment
#指定控制器的一些属性,Deployment是一个控制器,是元数据信息,像是指定了Deployment的名字、标签、副本数,通过标签管理具体的pods
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 3
#被管理对象,就是pod了,定义了容器Pod标签,标记哪个控制器来控制他,标签为nginx,也定义了容器名称为nginx,镜像为nginx:latest,容器内部端口为80,控制器通过标签来匹配pod,通过这个文件描述出要创建一个怎样的资源对象
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
部署服务
[root@k8s01 yml]# kubectl create -f deployment.yaml
[root@k8s01 yml]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-deployment-59c9f8dff-qx67z 1/1 Running 0 15s
nginx-deployment-59c9f8dff-tprf4 1/1 Running 0 15s
nginx-deployment-59c9f8dff-zrbf2 1/1 Running 0 15s
#已经创建好了,现在外部还无法访问,还需要创建一个service
发布服务
[root@k8s01 yml]# cat services.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-service
labels:
app: nginx
spec:
type: NodePort
ports:
- port: 80
targetPort: 80
selector:
app: nginx
#这里配置的是pod的标签,也就是nginx,请确保有所标签都是能匹配的到的
[root@k8s01 yml]# kubectl create -f services.yaml
[root@k8s01 yml]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 39h
nginx-service NodePort 10.0.0.133 <none> 80:31915/TCP 13s
[root@k8s01 yml]#
访问节点
[root@k8s01 yml]# for i in `echo 192.168.10.{92,93,95}:31915`;do curl -I $i;done
HTTP/1.1 200 OK
Server: nginx/1.17.10
Date: Wed, 27 May 2020 03:11:07 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 14 Apr 2020 14:19:26 GMT
Connection: keep-alive
ETag: "5e95c66e-264"
Accept-Ranges: bytes
HTTP/1.1 200 OK
Server: nginx/1.17.10
Date: Wed, 27 May 2020 03:11:07 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 14 Apr 2020 14:19:26 GMT
Connection: keep-alive
ETag: "5e95c66e-264"
Accept-Ranges: bytes
HTTP/1.1 200 OK
Server: nginx/1.17.10
Date: Wed, 27 May 2020 03:11:07 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 14 Apr 2020 14:19:26 GMT
Connection: keep-alive
ETag: "5e95c66e-264"
Accept-Ranges: bytes
#更新回滚之类的一般不会写配置文件,直接用kubectl命令去做了,其实Deployment和service的可以写到一个文件中,只需要使用---分隔就好了
生成YAML文件
其实YAML文件是可以生成的,使用kubectl就可以,现在把上面部署nginx的YAML文件转成命令
通过kubectl run
kubectl run nginx --image=nginx:latest --replicas=3 --port=80 --dry-run -o yaml > nginx.yaml
#加了--try-run只是测试命令是否能正常运行,而不会创建服务
[root@k8s01 yml]# cat nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
run: nginx
name: nginx
spec:
replicas: 3
selector:
matchLabels:
run: nginx
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
run: nginx
spec:
containers:
- image: nginx:latest
name: nginx
ports:
- containerPort: 80
resources: {}
status: {}
使用kubectl get
#现在有一个nginx的服务,现在把他Deployment的yaml导出来
[root@k8s01 yml]# kubectl get deployment nginx-deployment -o yaml >nginx.yaml
[root@k8s01 yml]# cat nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
deployment.kubernetes.io/revision: "1"
creationTimestamp: "2020-05-27T03:00:38Z"
generation: 1
name: nginx-deployment
namespace: default
resourceVersion: "69740"
selfLink: /apis/apps/v1/namespaces/default/deployments/nginx-deployment
uid: 863a3df1-c4d7-448b-92b8-786e38c4ecf5
spec:
progressDeadlineSeconds: 600
replicas: 3
revisionHistoryLimit: 10
selector:
matchLabels:
app: nginx
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
creationTimestamp: null
labels:
app: nginx
spec:
containers:
- image: nginx:latest
imagePullPolicy: Always
name: nginx
ports:
- containerPort: 80
protocol: TCP
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
status:
availableReplicas: 3
conditions:
- lastTransitionTime: "2020-05-27T03:00:52Z"
lastUpdateTime: "2020-05-27T03:00:52Z"
message: Deployment has minimum availability.
reason: MinimumReplicasAvailable
status: "True"
type: Available
- lastTransitionTime: "2020-05-27T03:00:38Z"
lastUpdateTime: "2020-05-27T03:00:52Z"
message: ReplicaSet "nginx-deployment-59c9f8dff" has successfully progressed.
reason: NewReplicaSetAvailable
status: "True"
type: Progressing
observedGeneration: 1
readyReplicas: 3
replicas: 3
updatedReplicas: 3
Pod容器的字段拼写忘记
kubectl explain pods.spec.containers