前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >K8S基础搭建使用

K8S基础搭建使用

作者头像
cuijianzhe
发布于 2022-06-14 10:10:15
发布于 2022-06-14 10:10:15
53600
代码可运行
举报
文章被收录于专栏:cuijianzhecuijianzhe
运行总次数:0
代码可运行

一、 K8S 架构

除了核心组件,还有一些推荐的 Add-ons:

组件名称

说明

kube-dns

负责为整个集群提供 DNS 服务

Ingress Controller

为服务提供外网入口

Heapster

提供资源监控

Dashboard

提供 GUI

Federation

提供跨可用区的集群

Fluentd-elasticsearch

提供集群日志采集、存储与查询

K8S 核心功能:

  • 自愈: 重新启动失败的容器,在节点不可用时,替换和重新调度节点上的容器,对用户定义的健康检查不响应的容器会被中止,并且在容器准备好服务之前不会把其向客户端广播。
  • 弹性伸缩: 通过监控容器的 cpu 的负载值,如果这个平均高于 80%,增加容器的数量,如果这个平均低于 10%,减少容器的数量
  • 服务的自动发现和负载均衡: 不需要修改您的应用程序来使用不熟悉的服务发现机制,Kubernetes 为容器提供了自己的 IP 地址和一组容器的单个 DNS 名称,并可以在它们之间进行负载均衡。
  • 滚动升级和一键回滚: Kubernetes 逐渐部署对应用程序或其配置的更改,同时监视应用程序运行状况,以确保它不会同时终止所有实例。 如果出现问题,Kubernetes 会为您恢复更改,利用日益增长的部署解决方案的生态系统。

1.1 环境准备

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cat >> /etc/hosts <<EOF
10.0.0.202 master
10.0.0.215 etcd
10.0.0.197 node1
10.0.0.163 node2
EOF

1.2 etcd 节点安装

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@etcd ~]# yum install etcd -y
vim /etc/etcd/etcd.conf
6行:ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
21行:ETCD_ADVERTISE_CLIENT_URLS="http://10.0.0.215:2379"
systemctl start etcd.service
systemctl enable etcd.service
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@etcd ~]# etcdctl -C http://10.0.0.215:2379 cluster-health
member 8e9e05c52164694d is healthy: got healthy result from http://10.0.0.215:2379
cluster is healthy

1.3 master 节点安装:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
yum install kubernetes-master.x86_64 -y
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
vim /etc/kubernetes/apiserver 
8:  KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"
11行:KUBE_API_PORT="--port=8080"
17行:KUBE_ETCD_SERVERS="--etcd-servers=http://10.0.0.215:2379"
23行:KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"

vim /etc/kubernetes/config
22行:KUBE_MASTER="--master=http://10.0.0.202:8080"

systemctl enable kube-apiserver.service
systemctl restart kube-apiserver.service
systemctl enable kube-controller-manager.service
systemctl restart kube-controller-manager.service
systemctl enable kube-scheduler.service
systemctl restart kube-scheduler.service

检查服务是否正常

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@master ~]# kubectl get componentstatus 
NAME                 STATUS    MESSAGE             ERROR
scheduler            Healthy   ok                  
controller-manager   Healthy   ok                  
etcd-0               Healthy   {"health":"true"}

1.3 node 节点安装

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
yum install kubernetes-node.x86_64 -y

vim /etc/kubernetes/config 
22行:KUBE_MASTER="--master=http://10.0.0.202:8080"

vim /etc/kubernetes/kubelet
5行:KUBELET_ADDRESS="--address=0.0.0.0"
8行:KUBELET_PORT="--port=10250"
11行:KUBELET_HOSTNAME="--hostname-override=10.0.0.163" #node节点ip
14行:KUBELET_API_SERVER="--api-servers=http://10.0.0.202:8080"
17行:KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=10.0.0.202:5000/rhel7/pod-infrastructure:latest"   #这里需要把pod-infrastructure镜像做到本地镜像仓库

systemctl enable kubelet.service
systemctl restart kubelet.service
systemctl enable kube-proxy.service
systemctl restart kube-proxy.service

在 master 节点检查

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@master ~]# kubectl get node
NAME         STATUS    AGE
10.0.0.163   Ready     1d
10.0.0.197   Ready     1d

1.4 所有节点配置 flannel 网络

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
yum install flannel -y
sed -i 's#http://127.0.0.1:2379#http://10.0.0.215:2379#g' /etc/sysconfig/flanneld

##etcd节点:
etcdctl mk /atomic.io/network/config   '{ "Network": "172.18.0.0/16" }'

##master节点
yum install docker -y
systemctl enable flanneld.service 
systemctl restart flanneld.service 
service docker restart
systemctl restart kube-apiserver.service
systemctl restart kube-controller-manager.service
systemctl restart kube-scheduler.service

##node节点:
systemctl enable flanneld.service 
systemctl restart flanneld.service 
service docker restart
systemctl restart kubelet.service
systemctl restart kube-proxy.service

vim /usr/lib/systemd/system/docker.service
#在[Service]区域下增加一行
ExecStartPost=/usr/sbin/iptables -P FORWARD ACCEPT
systemctl daemon-reload 
systemctl restart docker

1.5 配置 master 为镜像仓库

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#所有节点
vim /etc/sysconfig/docker
OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false --registry-mirror=https://registry.docker-cn.com --insecure-registry=10.0.0.202:5000'

systemctl restart docker

#master节点(如有网络问题,多试几次)
docker run -d -p 5000:5000 --restart=always --name registry -v /opt/myregistry:/var/lib/registry  registry

二、 K8S 常用资源

2.1 pod 资源

pod 是最小资源单位.

k8s yaml 的主要组成

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiVersion: v1  api版本
kind: pod   资源类型
metadata:   属性
spec:       详细
  1. 创建一个 yaml 文件:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@master pod]# cat k8s_pod.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    app: web
spec:
  containers:
    - name: nginx
      image: 10.0.0.202:5000/nginx:latest
      ports:
        - containerPort: 80

基于 yaml 创建 pod:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@master pod]# kubectl create -f k8s_pod.yaml 
pod "nginx1" created
[root@master pod]# kubectl get pod
NAME      READY     STATUS              RESTARTS   AGE
nginx     0/1       ContainerCreating   0          12s

此时发现 pod 创建没能成功,通过 kubectl describe pod nginx 查看详细信息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Events:
  FirstSeen	LastSeen	Count	From			SubObjectPath	Type		Reason		Message
  ---------	--------	-----	----			-------------	--------	------		-------
  2m		2m		1	{default-scheduler }			Normal		Scheduled	Successfully assigned nginx to 10.0.0.197
  2m		43s		4	{kubelet 10.0.0.197}			Warning		FailedSync	Error syncing pod, skipping: failed to "StartContainer" for "POD" with ErrImagePull: "image pull failed for registry.access.redhat.com/rhel7/pod-infrastructure:latest, this may be because there are no credentials on this request.  details: (open /etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt: no such file or directory)"

  1m	6s	6	{kubelet 10.0.0.197}		Warning	FailedSync	Error syncing pod, skipping: failed to "StartContainer" for "POD" with ImagePullBackOff: "Back-off pulling image \"registry.access.redhat.com/rhel7/pod-infrastructure:latest\""

由上可见,需要本地镜像仓库需要 pod-infrastructure:latest 这个 pod 基础镜像,所以需要在拉取镜像

docker pull tianyebj/pod-infrastructure,并且 push 到本地镜像仓库

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker pull tianyebj/pod-infrastructure
docker tag docker.io/tianyebj/pod-infrastructure 10.0.0.202:5000/rhel7/pod-infrastructure:latest
docker push 10.0.0.202:5000/rhel7/pod-infrastructure:latest
#同时改下node节点: /etc/kubernetes/kubelet
#更改配置:KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=10.0.0.202:5000/rhel7/pod-infrastructure:latest"

systemctl restart kubelet.service

在此查看 pod 创建过程:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Events:
  FirstSeen	LastSeen	Count	From			SubObjectPath	Type		Reason		Message
  ---------	--------	-----	----			-------------	--------	------		-------
  14m		14m		1	{default-scheduler }			Normal		Scheduled	Successfully assigned nginx to 10.0.0.197
  13m		3m		7	{kubelet 10.0.0.197}			Warning		FailedSync	Error syncing pod, skipping: failed to "StartContainer" for "POD" with ErrImagePull: "image pull failed for registry.access.redhat.com/rhel7/pod-infrastructure:latest, this may be because there are no credentials on this request.  details: (open /etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt: no such file or directory)"

  13m	58s	54	{kubelet 10.0.0.197}		Warning	FailedSync	Error syncing pod, skipping: failed to "StartContainer" for "POD" with ImagePullBackOff: "Back-off pulling image \"registry.access.redhat.com/rhel7/pod-infrastructure:latest\""

  45s	45s	1	{kubelet 10.0.0.197}	spec.containers{nginx}	Normal	Pulling			pulling image "10.0.0.202:5000/nginx:1.13"
  46s	41s	2	{kubelet 10.0.0.197}				Warning	MissingClusterDNS	kubelet does not have ClusterDNS IP configured and cannot create Pod using "ClusterFirst" policy. Falling back to DNSDefault policy.
  41s	41s	1	{kubelet 10.0.0.197}	spec.containers{nginx}	Normal	Pulled			Successfully pulled image "10.0.0.202:5000/nginx:1.13"
  41s	41s	1	{kubelet 10.0.0.197}	spec.containers{nginx}	Normal	Created			Created container with docker id 9254a49fc62c; Security:[seccomp=unconfined]
  41s	41s	1	{kubelet 10.0.0.197}	spec.containers{nginx}	Normal	Started			Started container with docker id 9254a49fc62c

到此 pod 创建完成

详细

在这里需要把 pod 容器 tag 改成需要用的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@master pod]# docker tag docker.io/tianyebj/pod-infrastructure 10.0.0.202:5000/rhel7/pod-infrastructure:latest
[root@master pod]# docker images
REPOSITORY                                 TAG                 IMAGE ID            CREATED             SIZE
docker.io/registry                         latest              f32a97de94e1        9 months ago        25.8 MB
docker.io/tianyebj/pod-infrastructure      latest              34d3450d733b        2 years ago         205 MB
10.0.0.202:5000/rhel7/pod-infrastructure   latest              34d3450d733b        2 years ago         205 MB

强制删除 pod 资源:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@master pod]# kubectl delete pod nginx --force  --grace-period=0 -n  default
warning: Immediate deletion does not wait for confirmation that the running resource has been terminated. The resource may continue to run on the cluster indefinitely.
pod "nginx" deleted
安装 docker 镜像并且 push 到本地镜像仓库
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@master pod]# docker images
REPOSITORY                                 TAG                 IMAGE ID            CREATED             SIZE
docker.io/b3log/solo                       latest              4e49320bec76        2 days ago          152 MB
10.0.0.202:5000/b3log/solo                 latest              4e49320bec76        2 days ago          152 MB
docker.io/mysql                            5.7                 1e4405fe1ea9        2 weeks ago         437 MB
10.0.0.202:5000/nginx                      latest              231d40e811cd        2 weeks ago         126 MB
docker.io/nginx                            latest              231d40e811cd        2 weeks ago         126 MB
docker.io/registry                         latest              f32a97de94e1        9 months ago        25.8 MB
10.0.0.202:5000/rhel7/pod-infrastructure   latest              34d3450d733b        2 years ago         205 MB
docker.io/tianyebj/pod-infrastructure      latest              34d3450d733b        2 years ago         205 MB
[root@master pod]# docker tag docker.io/nginx 10.0.0.202:5000/nginx:latest
[root@master pod]# docker push 10.0.0.202:5000/nginx
[root@master pod]# docker tag docker.io/mysql:5.7  10.0.0.202:5000/mysql:5.7
[root@master pod]# docker push 10.0.0.202:5000/mysql
创建 pod
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@master pod]# kubectl create -f k8s_pod.yaml 
pod "nginx" created
[root@master pod]# kubectl get pod
NAME      READY     STATUS    RESTARTS   AGE
nginx     1/1       Running   0          7s
pod 运行多个容器:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@master pod]# cat k8s_pod2.yaml   
apiVersion: v1  
kind: Pod  
metadata:  
 name: test  
 labels:  
 app: web  
spec:  
 containers:  
 - name: nginx  
 image: 10.0.0.202:5000/nginx:latest  
 ports:  
 - containerPort: 80  
 - name: solo  
 image: 10.0.0.202:5000/b3log/solo:latest  
 command: ["sleep","10000"]  
[root@master pod]# kubectl create -f k8s_pod2.yaml   
pod "test" created  
[root@master pod]# kubectl get pod -o wide   
NAME      READY     STATUS    RESTARTS   AGE       IP            NODE  
nginx     1/1       Running   0          15h       172.18.57.2   10.0.0.197  
test      2/2       Running   0          15s       172.18.39.2   10.0.0.163
查看 k8s pod 的容器资源详细信息:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker inspect 3f6cdafa32f5

创建一个 pod 资源,才能实现 k8s 的高级功能.

pod 容器:基础架构容器

nginx 容器: 业务容器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@node1 ~]# docker ps   
CONTAINER ID        IMAGE                                             COMMAND                  CREATED             STATUS              PORTS               NAMES  
3f6cdafa32f5        10.0.0.202:5000/nginx:latest                      "nginx -g 'daemon ..."   17 hours ago        Up 17 hours                             k8s_nginx.c74a033c_nginx_default_e5a7a5ea-1bf8-11ea-950d-fa163ef9cf10_5e72b386  
d0198f64f479        10.0.0.202:5000/rhel7/pod-infrastructure:latest   "/pod"                   17 hours ago        Up 17 hours                             k8s_POD.7b6a03f3_nginx_default_e5a7a5ea-1bf8-11ea-950d-fa163ef9cf10_7ee05d13

2.2 ReplicationController 资源

k8s 资源的常见操作: kubectl create -f xxx.yaml kubectl get pod|rc kubectl describe pod nginx kubectl delete pod nginx 或者 kubectl delete -f xxx.yaml kubectl edit pod nginx rc:保证指定数量的 pod 始终存活,rc 通过标签选择器来关联 pod

POD 资源被关闭也会及时启动自愈。

rc 资源

pod 资源的高可用行

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@node2 ~]# docker ps -a -q
f14a9650d408
5a4a70671124
[root@node2 ~]# docker rm -f `docker ps -a -q`
f14a9650d408
5a4a70671124
[root@node2 ~]# docker ps -a -q
7f4142ea7eb9
2ec639b32132

pod 资源被强制删除停止后,这些资源会立即重新生成并启动。

rc 创建

rc:保证指定数量的 pod 始终够存活,rc 通过标签选择器来关联 pod

  • 创建 yaml 文件
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@master rc]# cat  k8s_rc.yaml 
apiVersion: v1
kind: ReplicationController
metadata:
  name: nginx
spec:
  replicas: 5
  selector:
    app: myweb
  template:
    metadata:
      labels:
        app: myweb
    spec:
      containers:
      - name: myweb
        image: 10.0.0.202:5000/nginx:1.13
        ports:
        - containerPort: 80
  • 创建 rc:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@master rc]# pwd
/root/k8s/rc
[root@master rc]# kubectl create -f k8s_rc.yaml 
replicationcontroller "nginx" created

查看状态:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@master rc]# kubectl  get rc
NAME      DESIRED   CURRENT   READY     AGE
nginx     5         5         5         9m
  • 启动了多个 pod

rc 作用:

当 node 节点上的 pod 资源在其中一个 node 挂掉之后,rc 会将挂掉的 node 上的 pod 资源驱逐到存活的 node 之上。

示例 1:

pod 资源删除后,会马上重新创建新的 pod。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@master rc]# kubectl get pod -o wide 
NAME          READY     STATUS    RESTARTS   AGE       IP            NODE
nginx         1/1       Running   0          3d        172.18.42.2   10.0.0.197
nginx-0lrwh   1/1       Running   0          37m       172.18.96.4   10.0.0.163
nginx-7wss6   1/1       Running   0          37m       172.18.42.4   10.0.0.197
nginx-g3pnd   1/1       Running   0          37m       172.18.96.3   10.0.0.163
nginx-j173g   1/1       Running   0          37m       172.18.96.5   10.0.0.163
nginx-pxlbx   1/1       Running   0          37m       172.18.42.5   10.0.0.197
nginxmysql    2/2       Running   0          1h        172.18.42.3   10.0.0.197
test          1/1       Running   0          1h        172.18.96.2   10.0.0.163
[root@master rc]# kubectl delete pod nginx-7wss6 
pod "nginx-7wss6" deleted
[root@master rc]# kubectl get pod -o wide 
NAME          READY     STATUS    RESTARTS   AGE       IP            NODE
nginx         1/1       Running   0          3d        172.18.42.2   10.0.0.197
nginx-0lrwh   1/1       Running   0          38m       172.18.96.4   10.0.0.163
nginx-g3pnd   1/1       Running   0          38m       172.18.96.3   10.0.0.163
nginx-j173g   1/1       Running   0          38m       172.18.96.5   10.0.0.163
nginx-j7jrw   1/1       Running   0          3s        172.18.42.6   10.0.0.197
nginx-pxlbx   1/1       Running   0          38m       172.18.42.5   10.0.0.197
nginxmysql    2/2       Running   0          1h        172.18.42.3   10.0.0.197
test          1/1       Running   0          1h        172.18.96.2   10.0.0.163
  • 示例 2:把 node2 删掉,会出现如下现象
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@master rc]# kubectl get pod -o wide 
NAME          READY     STATUS    RESTARTS   AGE       IP            NODE
nginx         1/1       Running   0          3d        172.18.42.2   10.0.0.197
nginx-0lrwh   1/1       Running   0          3h        172.18.96.4   10.0.0.163
nginx-g3pnd   1/1       Running   0          3h        172.18.96.3   10.0.0.163
nginx-j173g   1/1       Running   0          3h        172.18.96.5   10.0.0.163
nginx-j7jrw   1/1       Running   0          2h        172.18.42.6   10.0.0.197
nginx-pxlbx   1/1       Running   0          3h        172.18.42.5   10.0.0.197
nginxmysql    2/2       Running   1          3h        172.18.42.3   10.0.0.197
test          1/1       Running   0          3h        172.18.96.2   10.0.0.163
[root@master rc]# kubectl delete node 10.0.0.163
node "10.0.0.163" deleted
[root@master rc]# kubectl get pod -o wide 
NAME          READY     STATUS    RESTARTS   AGE       IP            NODE
nginx         1/1       Running   0          3d        172.18.42.2   10.0.0.197
nginx-fl07j   1/1       Running   0          2s        172.18.42.7   10.0.0.197
nginx-j7jrw   1/1       Running   0          2h        172.18.42.6   10.0.0.197
nginx-jp6jg   1/1       Running   0          2s        172.18.42.4   10.0.0.197
nginx-pxlbx   1/1       Running   0          3h        172.18.42.5   10.0.0.197
nginx-zr9mw   1/1       Running   0          2s        172.18.42.8   10.0.0.197
nginxmysql    2/2       Running   1          3h        172.18.42.3   10.0.0.197

node2 的 kubelet 重启后会自动注册到集群

rc 是通过什么来关联 pod 的呢?

通过更改 [root@master rc]# kubectl edit pod nginx 同一标签为 myweb 后,默认会把 pod 存活年龄最小的剔除

所以 rc 的 pod 资源是有标签选择器来进行维护。

rc 滚动升级

  • 版本升级:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@master rc]# kubectl rolling-update nginx -f k8s_rc1.yaml --update-period=10s

--update-period=10s:升级间隔 10s

找一个 pod 容器进行 nginx 版本测试

升级成功

  • 版本回滚:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@master rc]# kubectl rolling-update nginx2 -f k8s_rc.yaml --update-period=1s

版本测试:

  • 升级回滚配置文件:

最后总结一下 RC(Replica Set)的一些特性与作用。

◎ 在大多数情况下,我们通过定义一个 RC 实现 Pod 的创建及副本数量的自动控制。

◎ 在 RC 里包括完整的 Pod 定义模板。

◎ RC 通过 Label Selector 机制实现对 Pod 副本的自动控制。

◎ 通过改变 RC 里的 Pod 副本数量,可以实现 Pod 的扩容或缩容。

◎ 通过改变 RC 里 Pod 模板中的镜像版本,可以实现 Pod 的滚动升级。

2.3 service 资源

service 帮助 pod 暴露端口,通过架构图看出通过任何服务可通过 kube-proxy 组件进行通信。

创建一个 service

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@master svc]# cat k8s_svc.yaml 
apiVersion: v1
kind: Service
metadata:
  name: myweb
spec:
  type: NodePort  #ClusterIP
  ports:
    - port: 80          #clusterIP
      nodePort: 30000   #node port
      targetPort: 80    #pod port
  selector:
    app: myweb2
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@master svc]# kubectl create -f k8s_svc.yaml

注意: svc 标签选择器和 rc 的标签需要一致,不然访问不了后端服务。

通过:[root@master svc]# kubectl edit svc myweb 修改标签和 rc 标签一致。

  • 再次查看:
  • 并且现在和 pod 的 ip 相对应
  • 查看 node 服务 L:
  • 测试服务

测试负载均衡

  • 减少 pod 节点进行测试
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@master svc]# kubectl scale rc nginx --replicas=2

调整副本数量的命令

  • 进入容器修改 index 页面
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@master svc]# kubectl exec -it nginx-175x8 /bin/bash
root@nginx-175x8:/# cd /usr/share/nginx/html/
root@nginx-175x8:/usr/share/nginx/html# ls                  
50x.html  index.html
root@nginx-175x8:/usr/share/nginx/html# echo 'cuijianzhe' > index.html

测试:

  • 默认端口范围是 30000-32767 修改 ports 端口数量:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@master svc]# vim /etc/kubernetes/apiserver
KUBE_API_ARGS="--service-node-port-range=3000-50000"

[root@master svc]# systemctl restart kube-apiserver
  • 添加 svc 3000 端口
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@master svc]# cat k8s_svc2.yaml 
apiVersion: v1
kind: Service
metadata:
  name: myweb2
spec:
  type: NodePort  #ClusterIP
  ports:
    - port: 80          #clusterIP
      nodePort: 3000   #node port
      targetPort: 80    #pod port
  selector:
    app: myweb2

修改 svc 统一标签 myweb

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kubectl edit svc myweb
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@master svc]# kubectl  get svc -o wide
NAME         CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE       SELECTOR
kubernetes   10.254.0.1       <none>        443/TCP        3d        <none>
myweb        10.254.134.169   <nodes>       80:30000/TCP   55m       app=myweb
myweb2       10.254.55.214    <nodes>       80:3000/TCP    2m        app=myweb

通过一条命令添加 service 资源

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kubectl scale rc nginx --replicas=2
kubectl exec -it pod_name /bin/bash
kubectl expose rc nginx --type=NodePort --port=80

2.4 deployment 资源

有 rc 在滚动升级之后,会造成服务访问中断,于是 k8s 引入了 deployment 资源

  • 创建 deployment
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@master deploy]# cat k8s_deploy.yaml 
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: 10.0.0.202:5000/nginx:1.13
        ports:
        - containerPort: 80
        resources:
          limits:
            cpu: 100m
          requests:
            cpu: 100m
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@master deploy]# kubectl create -f k8s_deploy.yaml 
deployment "nginx-deployment" created
[root@master deploy]# kubectl get deploy
NAME               DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3         3         3            3           18s

给 deployment 分配端口,出现一个新的 svc:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@master deploy]# kubectl expose deployment nginx-deployment --type=NodePort --port=80
service "nginx-deployment" exposed
[root@master deploy]# kubectl get svc 
NAME               CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes         10.254.0.1       <none>        443/TCP        3d
myweb              10.254.134.169   <nodes>       80:30000/TCP   17h
myweb2             10.254.55.214    <nodes>       80:3000/TCP    16h
nginx-deployment   10.254.2.186     <nodes>       80:33604/TCP   13s

通过 curl 测试:

滚动升级:

更改 [root@master deploy]# kubectl edit deployment nginx-deployment 配置文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@master deploy]# kubectl edit deployment nginx-deployment 
#将 - image: 10.0.0.202:5000/nginx:1.13 改为
- image: 10.0.0.202:5000/nginx:latest

curl 测试升级完成:

升级策略
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@master deploy]# kubectl edit deployment nginx-deployment
...
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
    type: RollingUpdate
...
升级回滚
  • 第一种
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@master deploy]# kubectl rollout history deployment nginx-deployment
deployments "nginx-deployment"
REVISION	CHANGE-CAUSE
2		<none>
3		<none>
[root@master deploy]# kubectl rollout undo deployment nginx-deployment
deployment "nginx-deployment" rolled back
[root@master deploy]# kubectl rollout history deployment nginx-deployment
deployments "nginx-deployment"
REVISION	CHANGE-CAUSE
3		<none>
4		<none>

回滚之后版本:

指定回滚版本号:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@master deploy]# kubectl rollout undo deployment nginx-deployment --to-revision=4
deployment "nginx-deployment" rolled back
  • 第二种:因为第一种版本号镜像版本没有详细版本,删除 deplotment 用命令行启动 deployment,再次查看会发现具体到相关镜像版本号等信息
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@master deploy]# kubectl delete deployment nginx-deployment
deployment "nginx-deployment" deleted
[root@master deploy]# kubectl rollout history deployment nginx 
deployments "nginx"
REVISION	CHANGE-CAUSE
1		kubectl run nginx --image=10.0.0.202:5000/nginx:1.13 --replicas=3 --record

升级版本

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@master deploy]# kubectl set image deployment nginx nginx=10.0.0.202:5000/nginx:1.16
deployment "nginx" image updated
[root@master deploy]# kubectl rollout history deployment nginx 
deployments "nginx"
REVISION	CHANGE-CAUSE
1		kubectl run nginx --image=10.0.0.202:5000/nginx:1.13 --replicas=3 --record
2		kubectl edit deployment nginx
3		kubectl set image deployment nginx nginx=10.0.0.202:5000/nginx:1.16

[root@master deploy]# kubectl set image deployment nginx nginx=10.0.0.202:5000/nginx:latest
deployment "nginx" image updated
[root@master deploy]# kubectl rollout history deployment nginx 
deployments "nginx"
REVISION	CHANGE-CAUSE
1		kubectl run nginx --image=10.0.0.202:5000/nginx:1.13 --replicas=3 --record
3		kubectl set image deployment nginx nginx=10.0.0.202:5000/nginx:1.16
4		kubectl set image deployment nginx nginx=10.0.0.202:5000/nginx:latest

deployment 升级和回滚 命令行创建 deployment kubectl run nginx --image=10.0.0.202:5000/nginx:1.13 --replicas=3 --record 命令行升级版本 kubectl set image deploy nginx nginx=10.0.0.202:5000/nginx:1.15 查看 deployment 所有历史版本 kubectl rollout history deployment nginx deployment 回滚到上一个版本 kubectl rollout undo deployment nginx deployment 回滚到指定版本 kubectl rollout undo deployment nginx --to-revision=2

三、 Tomcat+Mysql 练习

在 K8S 容器之间相互访问,通过 VIP 地址!

  1. 启动 Mysql yaml 配置文件,创建 Rc 资源
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@master tomcat_demo]# cat mysql-rc.yaml 
apiVersion: v1
kind: ReplicationController
metadata:
  name: mysql
spec:
  replicas: 1
  selector:
    app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: 10.0.0.202:5000/mysql:5.7
        ports:
        - containerPort: 3306
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: '598941324'
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@master tomcat_demo]# kubectl create -f mysql-rc.yaml 
replicationcontroller "mysql" created

2.创建 Mysql-svc yaml 配置文件,创建 Service 资源

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@master tomcat_demo]# cat mysql-svc.yaml 
apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
 # type: NodePort  #ClusterIP
  ports:
    - port: 3306          
      targetPort: 3306    #pod port
  selector:
    app: mysql
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@master tomcat_demo]# kubectl create -f mysql-svc.yaml 
service "mysql" created
[root@master tomcat_demo]# kubectl get svc
NAME               CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes         10.254.0.1       <none>        443/TCP        4d
mysql              10.254.76.200    <none>        3306/TCP       1m
myweb              10.254.134.169   <nodes>       80:30000/TCP   1d
myweb2             10.254.55.214    <nodes>       80:3000/TCP    1d
nginx-deployment   10.254.2.186     <nodes>       80:33604/TCP   1d
  1. Tomcat yaml 配置文件,创建 Tomcat Rc 资源
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@master tomcat_demo]# cat tomcat-rc.yaml 
apiVersion: v1
kind: ReplicationController
metadata:
  name: tomcat
spec:
  replicas: 1
  selector:
    app: tomcat
  template:
    metadata:
      labels:
        app: tomcat
    spec:
      containers:
      - name: tomcat
        image: 10.0.0.202:5000/tomcat:latest
        ports:
        - containerPort: 8080
        env:
        - name: MYSQL_SERVICE_HOST
          value: '10.254.76.200'     #此处是上面查看svc的MySQL  CLUSTER-IP
        - name: MYSQL_SERVICE_PORT
          value: '3306'
  1. 创建 tomcat-svc yaml 配置文件,启动 tomcat-svc 资源
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@master tomcat_demo]# cat tomcat-svc.yaml 
apiVersion: v1
kind: Service
metadata:
  name: tomcat
spec:
  type: NodePort  #ClusterIP
  ports:
    - port: 8080          #clusterIP
      nodePort: 30008   #node port
      targetPort: 8080    #pod port
  selector:
    app: tomcat
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@master tomcat_demo]# kubectl create -f tomcat-svc.yaml 
service "tomcat" created

测试 tomcat 服务:


标题:K8S基础搭建使用

作者:cuijianzhe

地址:https://cloud.tencent.com/developer/article/2022811

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
Kubernetes(k8s)的deployment资源
答:deployment也是保证pod高可用的一种方式,明明已经有RC(Replication Controller),为什么还要引入deployment呢?是因为deployment解决了RC(Replication Controller)的一个痛点。是因为RC在进行版本升级的时候,会造成一个问题,就是它的svc(Service)短时间内访问不了了,deployment就是解决这个问题的。
别先生
2020/06/23
9190
Kubernetes(k8s)的deployment资源
Kubernetes(k8s)中namespace的作用、反向代理访问k8s中的应用、k8s监控服务heapster
答:Namespace命名空间,是kubernetes系统中的另一个非常重要的概念,Namespace在很多情况下用于实现多租户的资源隔离,不同的业务可以使用不同的namespace进行隔离。
别先生
2020/06/30
2K0
Kubernetes(k8s)中namespace的作用、反向代理访问k8s中的应用、k8s监控服务heapster
linux k8s权威踩坑指南
解决:无法连接数据库,书籍中mysql是latest,但是当时是15-16年左右,原来jdbc驱动可用,但是现在yaml文件中没有版本号,默认依然是latest,但是现在的jdbc驱动不能连接latest版本的mysql,故进行滚动升级命令如下:
葫芦
2019/05/20
1.6K0
Kubernetes(k8s)安装dns附件组件以及使用
答:Kubernetes中有一个很重要的特性,服务子发现。一旦一个service被创建,该service的service ip和service port等信息都可以被注入到pod中供它们使用。kubernetes主要支持两种service发现机制,第一种是环境变量,第二种是DNS。没有dns服务的时候,kubernetes会采用环境变量的形式,一个有很多service,环境变量会变得很复杂,为了解决这个问题,我们使用DNS服务。
别先生
2020/06/23
1.3K0
Kubernetes(k8s)安装dns附件组件以及使用
基于k8s、docker、jenkins、springboot构建docker服务。
本文介绍基于Jenkins + github + k8s + springboot构建docker服务。
Java帮帮
2018/12/28
1.1K0
基于k8s、docker、jenkins、springboot构建docker服务。
k8s命令全集2020版(最新整理)
波哥私人珍藏都是常用的命令: #查看所有namespace的pods运行情况 kubectl get pods --all-namespaces #查看具体pods,记得后边跟namespace名字哦 kubectl get pods kubernetes-dashboard-76479d66bb-nj8wr --namespace=kube-system # 查看pods具体信息 kubectl get pods -o wide kubernetes-dashboard-76479d66bb-nj8
IT运维技术圈
2022/06/26
4720
6. k8s + jenkins 实现持续集成(完)
我的registry在node节点上, node的ip是192.168.1.104
用户7798898
2020/09/27
2.1K0
6. k8s + jenkins 实现持续集成(完)
Kubernetes(k8s)持久化存储PV和PVC
答:k8s中的副本控制器保证了pod的始终存储,却保证不了Pod中的数据。只有启动一个新pod的,之前pod中的数据会随着容器的删掉而丢失。k8s中的rc启动指定数量的Pod,当某个Pod死掉了,会在新的节点启动新的Pod,k8s中想要实现数据持久化,需要使用一个叫做共享存储的,让Pod里面的数据挂载到这个共享存储上面,就算在新的节点启动新的Pod,依然可以保证数据不丢失。
别先生
2020/07/06
1.4K0
Kubernetes(k8s)持久化存储PV和PVC
Kubernetes(k8s)常用资源的使用、Pod的常用操作
答:k8s是通过定义一个Pod的资源,然后在Pod里面运行容器的。K8s最小的资源单位Pod。
别先生
2020/06/11
1.5K0
002.Kubernetes简单入门实例
提示:若不关闭鉴权,可能出现以下报错:Error creating: No API token found for service account "default"……
木二
2019/11/15
4770
k8s集群之kubernetes-dashboard和kube-dns组件部署安装
k8s集群之kubernetes-dashboard和kube-dns组件部署安装
三杯水Plus
2018/11/14
1.7K0
Docker集群编排工具之Kubernetes(K8s)介绍、安装及使用
K8s基础原理 k8s中文社区:https://www.kubernetes.org.cn/ 简介 Kubernetes与较早的集群管理系统Mesos和YARN相比,对容器尤其是 Docker的支持更加原生,同时提供了更强大的机制实现资源调度,自动 管理容器生命周期,负载均衡,高可用等底层功能,使开发者可以专注于开发应用。 Kubernetes是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用
863987322
2018/03/29
5K0
Docker集群编排工具之Kubernetes(K8s)介绍、安装及使用
kubernetes教程入门_centos7搭建k8s集群
kubernetes本质是一组服务器集群,可以在集群的每个节点上运行特定的程序,来对节点中的容器进行管理。
全栈程序员站长
2022/09/22
1.5K0
kubernetes教程入门_centos7搭建k8s集群
Kubernetes(k8s)的Service资源
答:运行在docker中的业务,想要被外界访问,我们需要为它做端口映射才能被访问,那么运行在k8s中的容器,为什么不能直接为它做端口映射呢?
别先生
2020/06/14
9370
Kubernetes(k8s)的RC(Replication Controller)副本控制器
1、RC(Replication Controller)副本控制器,Replication Controller的作用。
别先生
2020/06/12
1.8K0
K8S二进制部署过程-v1.17.0
到 https://github.com/coreos/etcd/releases 页面下载最新版本的发布包:
cuijianzhe
2022/06/14
7350
K8S二进制部署过程-v1.17.0
Kubernetes(k8s)中dashboard的部署。
1、k8s的dashboard的安装部署,首先需要将压缩包下载下来,然后进行解压缩操作。
别先生
2020/06/24
1.1K0
Kubernetes(k8s)中dashboard的部署。
Kubernetes 编排系统
1.1 Kubernetes简介 1.1.1 什么是Kubernetes Kubernetes (通常称为K8s,K8s是将8个字母“ubernete”替换为“8”的缩写) 是用于自动部署、扩展和管理
惨绿少年
2018/03/30
3K1
K8s集群部署篇–Kube-DNS(三)
1、部署Cluster DNS 1.1 原理:(看看吧,摘抄网上的↓) 通过前面对Kubernetes的讨论(Kubernetes核心概念总结).我们已经知道,每个Kubernetes service都绑定了一个虚拟IP 地址(ClusterIP),而且Kubernetes最初使用向pod中注入环境变量的方式实现服务发现,但这会带来环境变量泛滥等问题。故需要增加集群DNS服务为每个service映射一个域名。到Kubernetes v1.2版本时,DNS作为一个系统可选插件集成到Kubernetes集群中。
老七Linux
2018/05/31
2.3K0
k8s运维命令大全
k8s常用命令 node 查看服务器节点 kubectl get nodes 查看服务器节点详情 kubectl get nodes -o wide 节点打标签 kubectl label nodes <节点名称> labelName=<标签名称> 查看节点标签 kubectl get node --show-labels 删除节点标签 kubectl label node <节点名称> labelName- pod 查看pod节点 kubectl get pod 查看pod节点详情 kubectl g
ruochen
2021/12/04
5K0
推荐阅读
相关推荐
Kubernetes(k8s)的deployment资源
更多 >
LV.1
这个人很懒,什么都没有留下~
目录
  • 一、 K8S 架构
    • K8S 核心功能:
    • 1.1 环境准备
    • 1.2 etcd 节点安装
    • 1.3 master 节点安装:
    • 1.3 node 节点安装
    • 1.4 所有节点配置 flannel 网络
    • 1.5 配置 master 为镜像仓库
  • 二、 K8S 常用资源
    • 2.1 pod 资源
      • 详细
    • 2.2 ReplicationController 资源
    • rc 资源
      • pod 资源的高可用行
      • rc 创建
      • rc 是通过什么来关联 pod 的呢?
      • rc 滚动升级
    • 2.3 service 资源
      • 创建一个 service
      • 测试负载均衡
      • 通过一条命令添加 service 资源
    • 2.4 deployment 资源
  • 三、 Tomcat+Mysql 练习
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文