k8s项目实战教程

以一个部署在k8s上的小项目做例子,介绍k8s项目部署的过程

需要有k8s的基础,搭建k8s集群可用使用二进制文件,官方推荐使用容器部署的方式,这里使用的kubeadm快捷部署

使用kubeadm 1.13搭建集群(各个版本的搭建可能存在一些小的差异)

5台 centos7,最低版本
主机名分别是server1,server2,server3,server4,server5
1:系统更新: yum update -y
2:修改系统主机名 vim /etc/hostname
3:修改selinux:vim /etc/selinux/config,修改SELINUX=disabled,更改为disabled
4:关闭防火墙(非必要,可以自己配置端口):systemctl disable firewalld
5:修改主机名列表(非必要,可以搭建内部DNS):vim /etc/hosts,把server1到server5的地址添加上去
6:重启服务器:shutdown -r now
7:服务器可以配ssh免密登录(非必要)
8:安装docker:yum install docker -y
8.1:开启自启动:systemctl enable docker
8.2:修改docker的代理,不然会拉取不到k8s的镜像
vim /etc/systemd/system/multi-user.target.wants/docker.service
添加一行:
Environment=HTTP_PROXY=http://10.99.32.2:1080
8.3:刷新系统配置:systemctl daemon-reload,重启docker
9:安装kubeadm:
9.1:添加kubernetes的repo:vim /etc/yum.repos.d/kubernetes.repo,添加一下内容:

[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
exclude=kube*

9.2:配置yum的外网代理:需要使用代理,否则下载不了
vim /etc/yum.conf添加或者修改一行:
proxy=http://yourhost:yourport
9.3:安装:yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
9.4:开启自启动:systemctl enable kubelet && systemctl start kubelet
10:配置kubeadm相关:
10.1:在master节点上配置iptable(非必要,可能已经设置好了的)
vim /etc/sysctl.d/k8s.conf,添加两行内容
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
sysctl --system
10.2:关闭所有swap:swapoff -a
11:启动docker,初始化kubeadm,有时需要修改cgroup,这里不需要
systemctl start docker
kubeadm init,出现kubeadm join即是初始化成功
如果使用calico网络插件,需要指定一个分配的ip域:
kubeadm init --pod-network-cidr=192.168.0.0/16
12:配置管理端,根据提示复制一个config文件即可使用kubectl操作,操作成功后执行
kubectl get nodes,能看到信息即是正常,看不到提示The connection to the server localhost:8080 was refused - did you specify the right host or port?,则是没有配置config文件
13:安装slave节点:和安装master节点的步骤一样,1.13版的slave不需要下载一些镜像了,直接安装完了,swapoff -a,然后kubeadm join 10.99.32.3:6443 --token euoczm.lhfb8w6ngx98aj3z --discovery-token-ca-cert-hash sha256:d094ed1b6769f25247e6b1586541f7dbee59272cddb93bb35e054472e40984e4
14:全部加入完毕后在master机器上使用kubectl get nodes即可看到所有机器,但是是NotReady状态。
15:安装网络:使用的是calico网络插件:
wget https://docs.projectcalico.org/v3.3/getting-started/kubernetes/installation/hosted/kubernetes-datastore/calico-networking/1.7/calico.yaml
wget https://docs.projectcalico.org/v3.3/getting-started/kubernetes/installation/hosted/rbac-kdd.yaml
kubectl apply -f rbac-kdd.yaml
kubectl apply -f calico.yaml
16:查看kubectl get nodes 看到所有节点都是ready状态即可

第二部分:搭建pv
1:使用NFS搭建PVC存储卷(可以搭建动态pvc)
1.1:搭建NFS:在各个节点安装控件:yum -y install nfs-utils rpcbind
1.2:在master上创建一个共享目录:mkdir /nfsdisk
1.3:配置NFS服务器:vim /etc/exports,添加以下内容:

    /nfsdisk 10.99.32.3(rw,sync,fsid=0,no_root_squash) 10.99.32.10(rw,sync,fsid=0,no_root_squash) 10.99.32.12(rw,sync,fsid=0,no_root_squash) 10.99.32.31(rw,sync,fsid=0,no_root_squash) 10.99.32.32(rw,sync,fsid=0,no_root_squash)

ip地址为需要读写这个目录的客户端的ip地址
1.4:开启nfs服务自启动和运行:systemctl enable nfs && systemctl start nfs
1.5:刷新共享:exportfs -rv,如果看到exporting 10.99.32.3:/nfsdisk即为配置正确
1.6:需要在各个客户端启动nfs才可以,否则配置pv会出错
systemctl enable nfs && systemctl start nfs
1.7:配置PV和pvc,可以一个pvc被多个部署使用
创建一个pc.yaml文件,添加以下内容:

apiVersion: v1
kind: PersistentVolume
metadata:
    name: nfs-pv
spec:
    capacity:
        storage: 150Gi
    accessModes:
        - ReadWriteMany
    persistentVolumeReclaimPolicy: Retain
    nfs:
        server: 10.99.32.3
        path: /nfsdisk
---
apiVersion: v1
kind:  PersistentVolumeClaim
metadata:
    name: nfs-pvc
spec:
    accessModes:
        - ReadWriteMany
    resources:
        requests:
            storage: 150Gi
    volumeName: nfs-pv

1.8:创建pv和pvc:kubectl create -f pv.yaml
1.9:查看是否创建成功:kubectl get pv || kubectl get pvc

第三部分:搭建各个应用服务器,主要分为两块内容:
1:挂载volume(如果需要单独保存一些数据的,或者是数据库,redis等需要单独存储数据的应用服务器)
2:service配置:需要提供对外访问和对内访问的端口映射,这里配置简单的nodeport映射,复杂高级点的使用sitemesh方式
3:配置完部署的yaml文件后,直接使用kubectl create -f xxx.yaml即可
mysql服务器:

apiVersion: v1
kind: Service
metadata:
    name: mysql-cs
    labels:
        app: mysql
spec:
    type: NodePort
    ports:
    - name: mysql
        port: 3306
        nodePort: 31718
    selector:
        app: mysql
---
apiVersion: v1
kind: Service
metadata:
    name: mysql
    labels:
        app: mysql
spec:
    ports:
    - name: mysql
        port: 3306
    selector:
        app: mysql
---
apiVersion: apps/v1
kind: Deployment
metadata:
    name: mysql
spec:
    replicas: 1
    selector:
        matchLabels:
            app: mysql
    template:
        metadata:
            labels:
                app: mysql
        spec:
            containers:
            - name: mysql
                image: mysql:5.7.20
                env:
                - name: MYSQL_ALLOW_EMPTY_PASSWORD
                    value: "0"
                - name: MYSQL_ROOT_PASSWORD
                    value: "123456"
                ports:
                - name: mysql
                    containerPort: 3306
                volumeMounts:
                - name: data
                    mountPath: /var/lib/mysql
                    subPath: mysql
                - name: config
                    mountPath: /etc/mysql/conf.d/
                resources:
                    requests:
                        cpu: 800m
                        memory: 1Gi
                    limits:
                        cpu: 1000m
                        memory: 2Gi
                livenessProbe:
                    exec:
                        command: ["mysqladmin","-uroot","-pAwd123456789","ping"]
                    initialDelaySeconds: 30
                    periodSeconds: 10
                    timeoutSeconds: 5
                readinessProbe:
                    exec:
                        command: ["mysql","-h","127.0.0.1","-uroot","-pAwd123456789","-e","SELECT 1"]
                    initialDelaySeconds: 5
                    periodSeconds: 3
                    timeoutSeconds: 2
            volumes:
            - name: data
                persistentVolumeClaim:
                    claimName: nfs-pvc
            - name: config
                configMap:
                    name: mysql
---
apiVersion: v1
kind: ConfigMap
metadata:
    name: mysql
data:
    my.cnf: |
        [mysqld]
        sql_mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" 

rabbitmq服务器:

apiVersion: apps/v1
kind: Deployment
metadata:
    name: rabbitmq
spec:
    replicas: 1
    selector:
        matchLabels:
            app: rabbitmq
    template:
        metadata:
            labels:
                app: rabbitmq
        spec:
            containers:
            - name: rabbitmq
                image: rabbitmq:3.7.2-management-alpine
                env:
                - name: RABBITMQ_DEFAULT_USER
                    value: root
                - name: RABBITMQ_DEFAULT_PASS
                    value: awd123456789
                - name: RABBITMQ_DEFAULT_VHOST
                    value: /
                ports:
                - name: rabbitmq
                    containerPort: 5672
                - name: management
                    containerPort: 15672
                volumeMounts:
                - name: data
                    mountPath: /var/lib/rabbitmq
                    subPath: rabbitmq
                resources:
                    requests:
                        cpu: 500m
                        memory: 800Mi
                    limits:
                        cpu: 800m
                        memory: 1024Mi
            volumes:
            - name: data
                persistentVolumeClaim:
                    claimName: nfs-pvc
---
apiVersion: v1
kind: Service
metadata:
    name: rabbitmq-manager
spec:
    type: NodePort
    ports:
    - name: management
        port: 15672
        nodePort: 31717
    selector:
        app: rabbitmq
---
apiVersion: v1
kind: Service
metadata:
    name: rabbitmq
    labels:
        app: rabbitmq
spec:
    ports:
    - port: 5672
        name: rabbitmq
    selector:
        app: rabbitmq

redis服务器:
apiVersion: apps/v1
kind: Deployment
metadata:
    name: redis
spec:
    replicas: 1
    selector:
        matchLabels:
            app: redis
    template:
        metadata:
            labels:
                app: redis
        spec:
            containers:
            - name: redis
                image: redis:4.0.6-alpine
                ports:
                - name: redis
                    containerPort: 6379
                volumeMounts:
                - name: data
                    mountPath: /data
                    subPath: redis
                resources:
                    requests:
                        cpu: 500m
                        memory: 800Mi
                    limits:
                        cpu: 800m
                        memory: 1024Mi
            volumes:
            - name: data
                persistentVolumeClaim:
                    claimName: nfs-pvc
---
apiVersion: v1
kind: Service
metadata:
    name: redis-service
spec:
    type: NodePort
    ports:
    - name: redis
        port: 6379
        nodePort: 31715
    selector:
        app: redis
---
apiVersion: v1
kind: Service
metadata:
    name: redis-cs
    labels:
        app: redis
spec:
    ports:
    - port: 3306
        name: redis
    selector:
        app: redis 

第四部分构建自己的应用:
1:先讲自己的应用打包成镜像,然后推送到公有仓库,或者私有仓库
2:配置yaml文件,镜像使用自己打包的镜像

原文地址:https://blog.51cto.com/13860853/2362602

时间: 2024-10-05 10:15:27

k8s项目实战教程的相关文章

基于Servlet+JDBC+Bootstrap+MySQL+AJAX权限管理系统项目实战教程

项目简介 权限系统一直以来是我们应用系统不可缺少的一个部分,若每个应用系统都重新对系统的权限进行设计,以满足不同系统用户的需求,将会浪费我们不少宝贵时间,所以花时间来设计一个相对通用的权限系统是很有意义的.     本系统的设计目标是对应用系统的所有资源进行权限控制,比如应用系统的功能菜单.各个界面等进行权限的操控.技术介绍 · Servlet3.0 Servlet 3.0 作为JavaEE6 规范体系中一员,随着JavaEE6规范一起发布.该版本在前一版本(Servlet2.5)的基础上提供了

Vue基础入门到项目实战教程(2) —— Vue.js下载与安装

1.下载与安装Vue.js Vue.js的官网: https://cn.vuejs.org/ 如果在项目中使用Vue.js框架,有两种方式:一是在页面中使用Script的方式直接引入,可以在官网下载Vue.js的源码,也可以使用CDN的方式引入:二是使用NPM的方式构建Vue项目,或者是使用Vue-cli脚手架创建项目. 本节我们先通过Script标签在网页引入Vue.js的方式来学习Vue实例,因为这种方法上手简单,适合初学者学习Vue的基础语法入门.在后面的教程中,会单独介绍使用NPM和Vu

Python项目实战教程:web实时聊天室项目

新课强力来袭:基于Node.js的web实时聊天室项目! 麦子学院新课以马踏飞燕般的速度生粗来啦(*^__^*) .小伙伴们你萌确定不来一发吗? 啦啦啦--上图镇楼↓↓↓ 那些神奇的传送门→_→ 本课程:http://www.maiziedu.com/course/others/597-8698/ 李大大主页:http://www.maiziedu.com/group/common/course/59404/ 这里是正儿八经的课程介绍(快看快看o( ̄ヘ ̄o#)): 网站实时通讯一体化解决方案,采

进阶学习项目实战链接

进阶学习目录 Python Django Ansible Playbook自动化运维项目实战 https://pan.baidu.com/s/1MAz_sNypeDSySQCdLiOuDw 顶级资深工程师深度讲解Go语言开发入门到精通 Go编程爬虫实战视频 https://pan.baidu.com/s/1nx82k7mOn8ErlPSsCdLfTw Zabbix监控系统深度实践 https://pan.baidu.com/s/1v3bAFqhk890KokIsmu3CMQ Spring Boo

JAVA区块链项目实战

课程介绍 全国首套,基于java的区块链实战教程.目的是让更多的java编程者了解区块链,掌握区块链开发.1.区块链理论:以node.js例子区块链原理有深刻理解:2.区块链java实战:深刻理解区块链原理后能用java编写区块链项目. ------第一部分 项目演示 目录------------------------------------------------------------ 1-第一章-01-java区块链项目实战教程前言 2-第一章-02-Java项目三台内网服务器演示 3-

PokemonGo-LBS AR项目实战

<Pokemon GO>在2016年发布,立即成为一款现象级手游,时至今日也是最成功的AR游戏!<Pokemon GO>目前仍旧吸引全球范围内大批玩家入驻,而这也使得该款游戏创造了让人瞩目的收入. 近日据Sensor Tower数据显示,截止至2019年10月29日<Pokemon GO>在iOS.Android两大平台总收入已经超过30亿美元,累计下载次数5.41亿. 这款游戏中融入了先进的AR技术,玩家在游戏中需要捕捉神奇宝贝.玩家将要根据地理位置信息和藏匿在各处的

【ASP.NET实战教程】ASP.NET实战教程大集合,各种项目实战集合

[ASP.NET实战教程]ASP.NET实战教程大集合,各种项目实战集合,希望大家可以好好学习教程中,有的比较老了,但是一直很经典!!!!论坛中很多小伙伴说.net没有实战教程学习,所以小编连夜搜集整理出一些比较好的教程,望君好好珍惜,资源不易,且保持,且珍惜直接上资源截图: 下载地址[回复可见]:http://www.fu83.cn/thread-282-1-1.html 感觉文章写的好,一定要回复 推荐哦!!!

下载快速上手数据挖掘之solr搜索引擎高级教程(Solr集群、KI分词、项目实战)

Solr是一个高性能,采用Java开发,基于Lucene的全文搜索服务器.同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置.可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文搜索引擎. 快速上手数据挖掘之solr搜索引擎高级教程(Solr集群.KI分词.项目实战),刚刚入手,转一注册文件,视频的确不错,可以先下载看看:http://pan.baidu.com/s/1jIdgtWM 密码:s1t3

项目实战(连载):基于Angular2+Mongodb+Node技术实现的多用户博客系统教程(4)

本章主要讲什么(一句话)? <项目实战:基于Angular2+Mongodb+Node技术实现的多用户博客系统教程(4)> -- 基于Node的Express项目环境框架搭建 一.前言 从本节开始,我们将正式[多用户博客系统]的项目开发工作.首先我们先从后台Node部分开始做起,一步步带领大家完成整个博客系统的开发. 本篇将主要帮助大家把Node环境下的Express框架搭建起来,后继后台将会在这个框架上进行扩展与业务逻辑开发. 二.项目环境 Node.js: v 6.x Express: v