GVKun编程网logo

项目环境搭建【Docker+k8s】八 kubernetes ConfigMap(使用docker部署k8s项目)

25

想了解项目环境搭建【Docker+k8s】八kubernetesConfigMap的新动态吗?本文将为您提供详细的信息,我们还将为您解答关于使用docker部署k8s项目的相关问题,此外,我们还将为您

想了解项目环境搭建【Docker+k8s】八 kubernetes ConfigMap的新动态吗?本文将为您提供详细的信息,我们还将为您解答关于使用docker部署k8s项目的相关问题,此外,我们还将为您介绍关于09-kubernetes configMap secret、docker & kubernetes 环境搭建、Docker Kubernetes(K8s)简介、Docker系列(三):将.Net Core Api部署到Kubernetes (K8s)中的新知识。

本文目录一览:

项目环境搭建【Docker+k8s】八 kubernetes ConfigMap(使用docker部署k8s项目)

项目环境搭建【Docker+k8s】八 kubernetes ConfigMap(使用docker部署k8s项目)

项目环境搭建【Docker+k8s】八 kubernetes ConfigMap

接着上一篇的内容,我们已经部署了MysqL服务,思考一个问题,当我们想修改配置文件如何修改?本节引入ConfigMap,ConfigMap顾名思义,是用于保存配置数据的键值对,可以用来保存单个属性,也可以保存配置文件。Secret可以为Pod提供密码、Token、私钥等敏感数据;对于一些非敏感数据,比如应用的配置信息,则可以使用ConfigMap。

使用ConfigMap配置MysqL

创建MysqL-svc.yml配置文件

apiVersion: v1
kind: ConfigMap
Metadata:
  name: MysqL-open-config
data: 
  #这里是键值对数据
  MysqLd.cnf: |
    [client]
    port=3306
    [MysqL]
    no-auto-rehash
    [MysqLd]
    skip-host-cache
    skip-name-resolve
    default-authentication-plugin=MysqL_native_password
    character-set-server=utf8mb4
    collation-server=utf8mb4_general_ci
    explicit_defaults_for_timestamp=true
    lower_case_table_names=1
---
apiVersion: extensions/v1beta1
kind: Deployment
Metadata:
  name: MysqL-open
spec:
  replicas: 1
  template:
    Metadata:
      labels: 
        name: MysqL-open
    spec:
      containers: 
        - name: MysqL-open
          image: MysqL:8.0.18
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 3306
          env:
            - name: MysqL_ROOT_PASSWORD
              value: "root"
		  #容器中的挂载目录
          volumeMounts:
            - name: cm-vol-open
              mountPath: /etc/MysqL/conf.d
            - name: nfs-vol-open
              mountPath: /var/lib/MysqL
      volumes: 
	   #挂载到数据卷
        - name: cm-vol-open
          configMap:
            name: MysqL-open-config
            items:
		    #configmap中的key
              - key: MysqLd.cnf
            #configmap key中匹配的value 写入名为MysqLd.cnf 的文件中
                path: MysqLd.cnf
        - name: nfs-vol-open
          persistentVolumeClaim:
            claimName: nfs-pvc-MysqL-open
---
apiVersion: v1
kind: Service
Metadata:
  name: MysqL-open
spec: 
  ports:
    - port: 3306
	  targetPort: 3306
  type: LoadBalancer
  selector:
    name: MysqL-open

如果之前部署了MysqL数据卷挂载,需要删除之前的数据文件,然后启动MysqL服务

[root@yn100-22 service]# kubectl get cm
NAME                DATA   AGE
MysqL-open-config   1      3m8s
[root@yn100-22 service]# kubectl describe  cm MysqL-open-config

使用数据库连接工具连接MysqL,使用命令kubectl get svc查看MysqL的端口,此时MysqL已能正常使用。

关注微信公众号,免费获取文档及资源

alt 微信公众号

学习交流QQ群【883210148】

alt QQ群

09-kubernetes configMap secret

09-kubernetes configMap secret

目录

  • 配置容器化应用配置的方式
    • 命令创建和测试configMap
      • 创建一个Pod 挂在测试
    • 命令行文件类创建方式
      • 创建Pod测试
      • 创建后测试
    • 贴近实际进行测试
      • 创建后测试

配置容器化应用配置的方式

  1. 自定义命令行参数来实现;
    1. command
    2. args []
  2. 把配置文件直接打入进项;
  3. 环境变量实现, 容器从物理机中的环境变量来导入配置
    1. 所配置的应用支持从环境变量中来读取
    2. 用预处理脚本entrypoint处理,通过环境变量传递过来的配置
  4. 存储卷;通过挂在对应的已经存放了配置文件的存储卷上

configMap

将配置文件从镜像中解耦, 从而增强了应用的可以执行以及应用的复制性.

命令创建和测试configMap

命令行键值对创建

kubectl describe configmap Nginx-www -o yaml
[root@master volume]# kubectl create configmap Nginx-config --from-literal=Nginx_port=80 --from-literal=server_name=myapp.sijiayong.com
configmap/Nginx-config created
[root@master volume]# kubectl get configmap
NAME           DATA   AGE
Nginx-config   2      7s
[root@master volume]# kubectl describe configmap Nginx-config
Name:         Nginx-config
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
Nginx_port:
----
80
server_name:
----
myapp.sijiayong.com
Events:  <none>

创建一个Pod 挂在测试

配置清单如下:

[root@master configmap]# cat pod-configmap.yaml 
apiVersion: v1
kind: Pod
Metadata:
  name: pod-cm
  namespace: default
  labels:
    app: myapp
    tier: frontend
  annotations:
    jubaozhu.com/created-by: "cluster admin"
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
    ports:
    - name: http
      containerPort: 80
    env:                            # 这里使用env, 表示容器中会用环境变量导入
    - name: Nginx_SERVER_PORT       # 这里的name表示容器中的key值
      valueFrom:
        configMapKeyRef:
          name: Nginx-config        # 这里name是指向configMap对应的名称
          key: Nginx_port           # 表示容器中key 所对应的 value的值, 此处取值的地方是定义的configMap中的对应的value值
    - name: Nginx_SERVER_NAME       # 因为要导入两个值,所以要写两份, 写法和上面的导入环境变量的方式相同
      valueFrom:
        configMapKeyRef:
          name: Nginx-config
          key: server_name

创建后测试

[root@master configmap]# kubectl apply -f pod-configmap.yaml 
pod/pod-cm created
[root@master configmap]# kubectl get pod -o wide
NAME          READY   STATUS    RESTARTS   AGE   IP            NODE                NOMINATED NODE   READInesS GATES
pod-cm        1/1     Running   0          8s    10.244.1.30   node03.kubernetes   <none>           <none>

创建Pod后,进入到对应的容器中查看环境变量

把端口变更为8080

[root@master configmap]# kubectl exec -it pod-cm -- /bin/sh
/ # env
MYAPP_SVC_PORT_80_TCP_ADDR=10.98.57.156
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_SERVICE_PORT=443
MYAPP_SVC_PORT_80_TCP_PORT=80
HOSTNAME=pod-cm
SHLVL=1
MYAPP_SVC_PORT_80_TCP_PROTO=tcp
HOME=/root
Nginx_SERVER_PORT=80
Nginx_SERVER_NAME=myapp.sijiayong.com
... ...
... ...

可以通过命令行edit编辑configMap

[root@master configmap]# kubectl edit configmap Nginx-config
configmap/Nginx-config edited
[root@master configmap]# kubectl describe configmap Nginx-config
Name:         Nginx-config
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
Nginx_port:
----
8080
server_name:
----
myapp.sijiayong.com
Events:  <none>

修改之后, 需要些许时间等待后,容器中的环境变量就会变更,需要再次进入容器后查看环境变量中的端口的值是否有变化

命令行文件类创建方式

首先需要手动编辑一个相应的配置文件

[root@master configmap]# cat www.conf 
server {
    server_name myapp.sijiayong.com;
    listen 80;
    root /data/web/html/;
}

然后使用命令创建如下:

[root@master configmap]# kubectl create configmap Nginx-www --from-file=www.conf        # 这里只有一个等号, 表示 key 就是文件名称, 而value 是文件内容
configmap/Nginx-www created
[root@master configmap]# kubectl get configmap
NAME           DATA   AGE
Nginx-config   2      2m41s
Nginx-www      1      4s
[root@master configmap]# kubectl describe configmap Nginx-www
Name:         Nginx-www
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
www.conf:
----
server {
    server_name myapp.sijiayong.com;
    listen 80;
    root /data/web/html/;
}

Events:  <none>
[root@master configmap]# kubectl get configmap Nginx-www -o yaml
apiVersion: v1
data:
  www.conf: |
    server {
        server_name myapp.sijiayong.com;
        listen 80;
        root /data/web/html/;
    }
kind: ConfigMap
Metadata:
  creationTimestamp: "2019-08-06T08:44:37Z"
  name: Nginx-www
  namespace: default
  resourceVersion: "3850257"
  selfLink: /api/v1/namespaces/default/configmaps/Nginx-www
  uid: 81050135-532c-4f0e-8fcf-99727cc2c498

创建Pod测试

创建相应清单文件

[root@master configmap]# cat pod-configmap-2.yaml 
apiVersion: v1
kind: Pod
Metadata:
  name: pod-cm-2
  namespace: default
  labels:
    app: myapp
    tier: frontend
  annotations:
    jubaozhu.com/created-by: "cluster admin"
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
    ports:
    - name: http
      containerPort: 80
    volumeMounts:                       # 可直接挂在configMap到Pod中
    - name: Nginxconf                   # 这里指定卷名称
      mountPath: /etc/Nginx/config.d/   # 这里指定挂在的路径
      readOnly: true                    # 这里表示当挂载失败的时候,容器能否启动成功,True表示可以正常启动,否则一点挂载失败,Pod的状态是Error
  volumes:                      # 定义一个卷, 实质上是一个configMap
  - name: Nginxconf             # 卷名称
    configMap:
      name: Nginx-config        # 这里指定 configMap对应的名称

创建后测试

[root@master configmap]# kubectl apply -f pod-configmap-2.yaml 
pod/pod-cm-2 created
[root@master configmap]# kubectl get pods -o wide
NAME          READY   STATUS    RESTARTS   AGE   IP            NODE                NOMINATED NODE   READInesS GATES
pod-cm-2      1/1     Running   0          5s    10.244.2.29   node02.kubernetes   <none>           <none>

然后进入Pod中查看挂在是否正常

[root@master configmap]# kubectl exec -it pod-cm-2 -- /bin/sh
/ # cd /etc/Nginx/config.d/
/etc/Nginx/config.d # ls -l
total 0
lrwxrwxrwx    1 root     root            17 Aug  6 09:12 Nginx_port -> ..data/Nginx_port
lrwxrwxrwx    1 root     root            18 Aug  6 09:12 server_name -> ..data/server_name
/etc/Nginx/config.d # cat server_name 
myapp.sijiayong.com/etc/Nginx/config.d # cat Nginx_port         # servername显示正常
8080/etc/Nginx/config.d # exit                                  # 端口显示正常

同样也支持在线修改, 需要些许时间后就容器中的对应的值就会产生变化

贴近实际进行测试

上面创建了一个Nginx-www 的一个正常的Nginx主机的一个配置文件, 下面挂在到Pod中尝试访问是否正常

[root@master configmap]# vim pod-configmap-3.yaml
apiVersion: v1
kind: Pod
Metadata:
  name: pod-cm-3
  namespace: default
  labels:
    app: myapp
    tier: frontend
  annotations:
    jubaozhu.com/created-by: "cluster admin"
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
    ports:
    - name: http
      containerPort: 80
    volumeMounts:
    - name: Nginxconf
      mountPath: /etc/Nginx/conf.d/     # 挂载点为实际的Nginx配置文件目录
      readOnly: true
  volumes:
  - name: Nginxconf
    configMap:
      name: Nginx-www

创建后测试

[root@master configmap]# kubectl apply -f pod-configmap-3.yaml 
pod/pod-cm-3 created
[root@master configmap]# kubectl get pods -o wide
NAME          READY   STATUS    RESTARTS   AGE   IP            NODE                NOMINATED NODE   READInesS GATES
pod-cm-3      1/1     Running   0          6s    10.244.3.33   node01.kubernetes   <none>           <none>

进入Pod中查看

[root@master configmap]# kubectl exec -it pod-cm-3 -- /bin/sh
/ # cd /etc/Nginx/conf.d/
/etc/Nginx/conf.d # ls
www.conf
/etc/Nginx/conf.d # cat www.conf 
server {
    server_name myapp.sijiayong.com;
    listen 8088;
    root /data/web/html/;
}

因为配置的Nginx虚拟主机对应的目录不存在,下面来手动创建目录和写入测试内容

[root@master configmap]# kubectl exec -it pod-cm-3 -- /bin/sh
/ # mkdir /data/web/html -p
/ # echo '<h1>Nginx Server configured by ConfigMap</h1>' > /data/web/html/index.html

集群外部测试访问:

<h1>Nginx Server configured by ConfigMap</h1>
[root@master configmap]# curl 10.244.3.33:80

需要注意的是, 如果在线修改了configMap后, 这里需要手动进入到Pod中, 重载一下Nginx才可以, 否则不生效

docker & kubernetes 环境搭建

docker & kubernetes 环境搭建

此文环境为阿里云服务器(使用了部分阿里镜像加速)

 

安装 Docker(ubuntu 16.4)

# step 1: 安装必要的一些系统工具
sudo apt-get update && apt-get -y install apt-transport-https ca-certificates curl software-properties-common
# step 2: 安装 GPG 证书
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# Step 3: 写入软件源信息
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# Step 4: 更新并安装 Docker-CE
sudo apt-get -y update && apt-get -y install docker-ce

# 安装指定版本的 Docker-CE:
# Step 1: 查找 Docker-CE 的版本:
# apt-cache madison docker-ce
# docker-ce | 17.03.1~ce-0~ubuntu-xenial | http://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages
# docker-ce | 17.03.0~ce-0~ubuntu-xenial | http://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages
# Step 2: 安装指定版本的 Docker-CE: (VERSION 例如上面的 17.03.1~ce-0~ubuntu-xenial)
# sudo apt-get -y install docker-ce=[VERSION]

 


安装 k8s 测试环境 Minikube (ubuntu 16.4)
# 安装 kubectl
# step 1:通过 snap 安装
sudo apt update && apt -y install snapd
# step 2:安装 kubectl
sudo snap install kubectl --classic
# 验证 kubectl ,Ubuntu 需要重启后才能验证成功 ,验证命令:kubectl version
# step 3:安装 minikube
curl -Lo minikube http://kubernetes.oss-cn-hangzhou.aliyuncs.com/minikube/releases/v0.30.0/minikube-linux-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin/
# step 4:启动 minikube
# 安装失败时先执行移除 rm -r ~/.minikube & minikube delete
minikube start --registry-mirror=https://registry.docker-cn.com --vm-driver=none
# step 5:启动 minikube
minikube dashboard

 

# 如果 dashboard services 的 Type 为 ClusterIP,外网无法访问,需要修改为 NodePort
kubectl -n kube-system edit service kubernetes-dashboard
# 将 type: ClusterIP 改为 type: NodePort ,:wq 退出保存,会提示修改成功
# 再次查看验证
kubectl -n kube-system get service kubernetes-dashboard

 

#根据自己的登录名来修改对应参数
$ sudo docker login --username=tbhtest@aliyun.com registry.cn-hangzhou.aliyuncs.com
$ sudo docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/tom/kluas:[镜像版本号]
$ sudo docker push registry.cn-hangzhou.aliyuncs.com/tom/kluas:[镜像版本号]

 

原文出处:https://www.cnblogs.com/tomkluas/p/10108864.html

Docker Kubernetes(K8s)简介

Docker Kubernetes(K8s)简介

入职了新公司,使用了Docker和K8s,需要有一个基础的了解,对网络上相关信息进行了简单总结。

一Docker

###1简介: Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。 ###2功能: 虚拟化解决了应用运行环境的复杂,硬件管理的问题,提供可移植性。 ###3架构: Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。 Docker 客户端(clients)会与 Docker 守护进程进行通信。 Docker 守护进程(daemon)和容器运行在一台主机上。用户并不直接和守护进程进行交互,而是通过 Docker 客户端间接和其通信。 Docker 容器和文件夹很类似,一个Docker容器包含了所有的某个应用运行所需要的环境。每一个 Docker 容器都是从 Docker 镜像(image)创建的。 Docker仓库(repsitory)用来保存镜像。

###4应用场景: 1)提供一次性的环境 2)提供弹性的云服务 3)组建微服务架构

二K8s

###1简介: 全新的基于容器技术的分布式架构领先方案。Kubernetes(k8s)是Google开源的容器集群管理系统(谷歌内部:Borg)。在Docker技术的基础上,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能,提高了大规模容器集群管理的便捷性。 ###2功能: Kubernetes内奸的透明负载均衡和故障恢复机制,不管后端有多少服务进程,也不管某个服务进程是否会由于发生故障而重新部署到其他机器,都不会影响我们队服务的正常调用。 ###3架构: Master:集群控制管理节点,所有的命令都经由master处理。 Node:是kubernetes集群的工作负载节点。Master为其分配工作,当某个Node宕机时,Master会将其工作负载自动转移到其他节点。负责Pod对应容器的创建暂停等任务。 kubelet:运行在每个计算节点上,作为agent,接受分配该节点的Pods任务及管理容器,周期性获取容器状态,反馈给kube-apiserver。 Pod:Pod是Kurbernetes进行创建、调度和管理的最小单位,它提供了比容器更高层次的抽象,使得部署和管理更加灵活。一个Pod可以包含一个容器或者多个相关容器。 在Kubenetes中,所有的容器均在Pod中运行,一个Pod可以承载一个或者多个相关的容器,同一个Pod中的容器会部署在同一个物理机器上并且能够共享资源。 ###核心组件: etcd保存了整个集群的状态; apiserver提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制; controller manager负责维护集群的状态,比如故障检测、自动扩展、滚动更新等; scheduler负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上; kubelet负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理; Container runtime负责镜像管理以及Pod和容器的真正运行(CRI); kube-proxy负责为Service提供cluster内部的服务发现和负载均衡;

Docker系列(三):将.Net Core Api部署到Kubernetes (K8s)中

Docker系列(三):将.Net Core Api部署到Kubernetes (K8s)中

1.新建一个WebApi项目,并添加Dockerfile文件:

FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base
WORKDIR /app
EXPOSE 80

FROM microsoft/dotnet:2.1-sdk AS build
WORKDIR /src
Copy . .

RUN dotnet restore
RUN dotnet build -c Release -o /app

FROM build as publish
RUN dotnet publish -c Releease -o /app

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "k8s-demo.dll"]

编译一下,然后通过Docker打包成镜像:docker build -t wei/k8s-demo .

完成后通过docker images查看下:

 

 然后将其推送到Docker仓库中,所以你需要去Docker官网注册一个账户,注册完成后进行登录:docker login --username  xxx

xxx是你的用户名,接着会让你输入密码,验证成功后会提示Login Succeeded

将镜像推送到仓库这个步骤是不能省略的,因为编写K8s部署文件的时候,需要从仓库拉取镜像,因为服务器在国外,所以会有点慢。

还有一个问题就是你的镜像名字需要用你的Docker用户名开头,比如xxx/k8s-demo 这种,xxx是你Docker的用户名,不然上传会提示没有权限:

 

 

镜像推送到仓库之后我们就需要编写k8s的部署文件了 :deploy.yaml

 

kind: Deployment
apiVersion: apps/v1
metadata:
  labels:
    k8s-app: k8s-demo
  name: k8s-demo
  namespace: netcore
spec:
  replicas: 2
  selector:
    matchLabels:
      k8s-app: k8s-demo
  template:
    metadata:
      labels:
        k8s-app: k8s-demo
    spec:
      containers:
      - name: k8s-demo
        image: xxx/k8s-demo
        ports:
        - containerPort: 80  

---
# ------------------- Service ------------------- #

kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: k8s-demo
  name: k8s-demo
  namespace: netcore
spec:
  type: NodePort
  ports:
    - port: 80
      targetPort: 80
  selector:
    k8s-app: k8s-demo

需要说明两个问题,标红的image就是我们推送到仓库的镜像,namespace是资源空间名称,也就是我们当前这个pod要运行的资源空间,所以我们需要创建一下这个资源空间:

kubectl create namespace netcore

创建完成后可以通过以下命令进行查看:kubectl get namespace netcore

然后我们就可以运行我们的部署文件了:kubectl create -f deploy.yaml

 

正常情况下会有两个提示,分别是deployment.apps "k8s-demo" created 和 service "k8s-demo" created

我在这步遇到的问题是yaml的格式问题,因为缩进不符合要求,折腾了好久,这个对格式的要求很严格,完成之后我们可以通过以下命令查看:kubectl get svc -n netcore 

我上面图中已经有了,结果显示我的这个pod运行在31080端口,此时我们可以通过浏览器测试:

或者我们也可以通过k8s控制台查看,如果没启动代理的通过kubectl proxy命令启动代理,然后访问以下地址:

http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/#!/overview?namespace=netcore

 

 将命名空间选到我们的netcore即可看到我们已经运行的服务k8s-demo,到此大功告成!!!

 

补充一下,当我们关机下次启动会发现k8s处于stop状态,这个时候我们需要重启下Docker,并使用以下命令切换到对应的Kubernetes context :

kubectl config use-context docker-for-desktop

今天的关于项目环境搭建【Docker+k8s】八 kubernetes ConfigMap使用docker部署k8s项目的分享已经结束,谢谢您的关注,如果想了解更多关于09-kubernetes configMap secret、docker & kubernetes 环境搭建、Docker Kubernetes(K8s)简介、Docker系列(三):将.Net Core Api部署到Kubernetes (K8s)中的相关知识,请在本站进行查询。

本文标签: