k8s+jenkins(DevOps全流程)
k8s集群搭建是参照别人的,链接找不到了。需要5台机器,3主2从,主最少搭建3台才能实现高可用。
流程jenkins打包代码 >> 把打包代码生成镜像 >> 备份镜像库旧镜像 >> 新镜像上传镜像库 >> k8s去镜像库拉取镜像 >> 运行yaml文件生成更新服务(jenkins执行的脚本和yaml文件都是文章下面)
#关闭firewall
systemctl disable firewalld
systemctl stop firewalld
setenforce 0 #临时关闭selinux
#永久关闭selinux去配置文件中/etc/sysconfig/selinux
hostnamectl set-hostname master1 #修改主机名,每台服务器都不一样
#配置hosts文件
cat /etc/hosts
192.168.51.213 master1
192.168.51.214 master2
192.168.51.211 node1
192.168.51.212 node2
#master1配置无密码登录(只有master1机器需要这步)
ssh-keygen -t rsa
ssh-copy-id master2
ssh-copy-id node1
ssh-copy-id node2
#开启转发
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_nonlocal_bind = 1
net.ipv4.ip_forward = 1
vm.swappiness=0
EOF
sysctl --system
#禁用交换分区
swapoff -a
#同步时间
ntpdate ntp1.aliyun.com
#安装启用ipvs作为转发工具
cat > /etc/sysconfig/modules/ipvs.modules <<EOFmodprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
#修改阿里云yum源
cat << EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
wget http://mirrors.aliyun.com/repo/Centos-7.repo -O /etc/yum.repos.d/CentOS-Base.repo
wget http://mirrors.aliyun.com/repo/epel-7.repo -O /etc/yum.repos.d/epel.repo
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
#安装配置keeplived和haproxy(只有2台master需要)
yum install -y keepalived haproxy
#修改keepalived配置文件master1的priority为100,node-02的priority为90,其他配置一样
cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
liumingtao@gxcards.com
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_1
}
vrrp_instance VI_1 {
state MASTER
interface ens192
lvs_sync_daemon_inteface ens192
virtual_router_id 88
advert_int 1
priority 100
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.51.210/24
}
}
#修改haproxy的配置文件,配置一样
cat /etc/haproxy/haproxy.cfg
global
chroot /var/lib/haproxy
daemon
group haproxy
user haproxy
log 127.0.0.1:514 local0 warning
pidfile /var/lib/haproxy.pid
maxconn 20000
spread-checks 3
nbproc 8
defaults
log global
mode tcp
retries 3
option redispatch
listen https-apiserver
bind 192.168.51.210:8443
mode tcp
balance roundrobin
timeout server 15s
timeout connect 15s
server apiserver01 192.168.51.213:6443 check port 6443 inter 5000 fall 5
server apiserver02 192.168.51.214:6443 check port 6443 inter 5000 fall 5
#启用keepalived和haproxy
systemctl enable keepalived && systemctl start keepalived
systemctl enable haproxy && systemctl start haproxy
#安装k8s相关组件(4台都需要)
yum install -y kubelet kubeadm kubectl ipvsadm ipset docker-ce
#启动docker
systemctl enable docker && systemctl start docker
#设置kubelet开机自启动
systemctl enable kubelet
#把集群默认配置生成为配置文件并做修改(只有master1需要此操作)
kubeadm config print init-defaults > kubeadm-init.yaml
cat kubeadm-init.yaml
#修改了advertiseAddress为master1的ip,controlPlaneEndpoint为192.168.51.210:8443,imageRepository修改为registry.cn-hangzhou.aliyuncs.com/google_containers用于在阿里云拉取镜像。podSubnet添加了ip10.244.0.0/16,这个用于flannel网络,不设置或设置错flannel不会安装成功。最后加3行,修改为ipvs转发模式
apiVersion: kubeadm.k8s.io/v1beta1
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 192.168.51.213
bindPort: 6443
nodeRegistration:
criSocket: /var/run/dockershim.sock
name: master1
taints:
- effect: NoSchedule
key: node-role.kubernetes.io/master
---
apiServer:
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta1
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controlPlaneEndpoint: "192.168.51.210:8443"
controllerManager: {}
dns:
type: CoreDNS
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: v1.14.0
networking:
dnsDomain: cluster.local
podSubnet: "10.244.0.0/16"
serviceSubnet: 10.96.0.0/12
scheduler: {}
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: "ipvs"
#拉取集群所需要镜像(master1操作)
kubeadm config images pull --config kubeadm-init.yaml
#初始化集群
kubeadm init --config kubeadm-init.yaml
#安装集群命令(master1操作)
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
#执行此脚本把master1证书拷贝到master2上
USER=root
CONTROL_PLANE_IPS="master2"
for host in ${CONTROL_PLANE_IPS}; do
ssh "${USER}"@$host "mkdir -p /etc/kubernetes/pki/etcd"
scp /etc/kubernetes/pki/ca.* "${USER}"@$host:/etc/kubernetes/pki/
scp /etc/kubernetes/pki/sa.* "${USER}"@$host:/etc/kubernetes/pki/
scp /etc/kubernetes/pki/front-proxy-ca.* "${USER}"@$host:/etc/kubernetes/pki/
scp /etc/kubernetes/pki/etcd/ca.* "${USER}"@$host:/etc/kubernetes/pki/etcd/
scp /etc/kubernetes/admin.conf "${USER}"@$host:/etc/kubernetes/
done
#master1初始化集群后生成2条命令类似
kubeadm join 192.168.51.210:8443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:c8195afaff02deb8f263d59e81a6abf0efaf52d799df07e555d221e9b0feb301 --experimental-control-plane --ignore-preflight-errors=all #这条在master2上执行,执行时间很慢耐心等待
#master2命令执行完后安装集群命令工具
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
kubeadm join 192.168.51.210:8443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:c8195afaff02deb8f263d59e81a6abf0efaf52d799df07e555d221e9b0feb301 #这条在node的2个节点执行,执行时间快
#安装网络攻击
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml (master1上执行)
#执行命令查看所有的节点有没有加入集群
kubectl get nodes
#执行命令查看安装的k8s组件是否成功(所有STATUS都是Runnig)
kubectl get pod -n kube-system
#执行命令查看集群网络是否正常
ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.96.0.1:443 rr
-> 192.168.51.213:6443 Masq 1 0 0
-> 192.168.51.214:6443 Masq 1 1 0
TCP 10.96.0.10:53 rr
-> 10.244.1.2:53 Masq 1 0 0
-> 10.244.1.3:53 Masq 1 0 0
TCP 10.96.0.10:9153 rr
-> 10.244.1.2:9153 Masq 1 0 0
-> 10.244.1.3:9153 Masq 1 0 0
UDP 10.96.0.10:53 rr
-> 10.244.1.2:53 Masq 1 0 0
-> 10.244.1.3:53 Masq 1 0 0
# ---完-----
jenkins拉取打包代码后,执行的脚本
#!/bin/bash
##编写dockerfile,把jar包导入docker镜像
cat <<EOF>>/var/lib/jenkins/workspace/app-web-user/Dockerfile
FROM centos7-java-webuser
RUN mkdir -p /app/web-user/
COPY default/web-user/target/app-web-user.jar /app/web-user/
EXPOSE 12220
EXPOSE 13220
WORKDIR /app/web-user/
ENTRYPOINT ["/usr/local/java/jdk1.8.0_101/bin/java","-Dsun.misc.URLClassPath.disableJarChecking=true -Xmx128M -Xms128M -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=12220","-jar","app-web-user.jar"]
EOF
##定义镜像后缀时间
DATE=`date +%y%m%d%H%M`
cd /var/lib/jenkins/workspace/app-web-user
##利用dockerfile生成docker镜像
docker build -t 192.168.51.211:5000\/webuser_$DATE .
##将镜像导入本地私有镜像库
docker push 192.168.51.211:5000\/webuser_$DATE
###修改启动容器镜像为最新版本
sed -i "14s/.*/ image: 192.168.51.211:5000\/webuser_$DATE/g" /k8s/web-user/web-user-pod.yaml
###k8s利用最新镜像启动docker容器
/usr/bin/kubectl apply -f /k8s/web-user/
k8s应用的yaml文件
cd /k8s/web-user/
cat web-user-pod.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: web-user
spec:
replicas: 2
template:
metadata:
labels:
app: web-user
spec:
containers:
- name: web-user
image: 192.168.51.211:5000/webuser_1908211449
ports:
- containerPort: 13220
cat web-user-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: web-user
spec:
ports:
- name: web-user-svc
port: 13220
targetPort: 13220
nodePort: 32221
selector:
app: web-user
type: NodePort
k8s+jenkins(DevOps全流程)的更多相关文章
- 如何使用 CODING 实践 DevOps 全流程
你好,欢迎使用 CODING!这份最佳实践将帮助你通过 CODING 研发管理系统来更好地实践 DevOps 流程. DevOps 的本质是打破各个部门之间的隔阂,打通企业的前中后台,推进跨部门协作. ...
- centos7搭建sonarqube环境+jenkins部署全流程
一.简介sonarqube是一个用于代码质量管理的开源平台,用于管理源代码的质量 不遵循代码标准sonar可以通过PMD,CheckStyle,Findbugs等等代码规则检测工具规范代码编写.潜在的 ...
- AI全流程开发难题破解之钥
摘要:通过对ModelArts.盘古大模型.ModelBox产品技术的解读,帮助开发者更好的了解AI开发生产线. 本文分享自华为云社区<[大厂内参]第16期:华为云AI开发生产线,破解AI全流程 ...
- 基于Jenkins的开发测试全流程持续集成实践
今年一直在公司实践CI,本文将近半年来的一些实践总结一下,可能不太完善或优美,但的确初步解决了我目前所在项目组的一些痛点.当然这仅是一家之言也不够完整,后续还会深入实践和引入Kubernetes进行容 ...
- 十分钟 CODING DevOps 全链路体验
近期 CODING 团队在 2019 KubeCon 大会上发布 DevOps 一站式解决方案:CODING 2.0.此次 CODING 全新上线了持续集成与制品库模块,通过自动化与标准化的方式来帮助 ...
- canvas 制作flappy bird(像素小鸟)全流程
flappy bird制作全流程: 一.前言 像素小鸟这个简单的游戏于2014年在网络上爆红,游戏上线一段时间内appleStore上的下载量一度达到5000万次,风靡一时, 近年来移动web的普及为 ...
- 全球首个全流程跨平台界面开发套件,PowerUI分析
一. 首个全流程跨平台界面开发套件,PowerUI正式发布 UIPower在DirectUI的基础上,自主研发全球首个全流程跨平台界面开发套件PowerUI(PUI)正式发布,PowerU ...
- 【Heritrix基础教程之4】开始一个爬虫抓取的全流程代码分析
在创建一个job后,就要开始job的运行,运行的全流程如下: 1.在界面上启动job 2.index.jsp 查看上述页面对应的源代码 <a href='"+request.getCo ...
- K8s+jenkins实现提升效率 —— 一些小记录
尝试下K8s + jenkins的组合,非常方便.在这里记录一下: kubernetes版本: 1.10 + deployment.yaml apiVersion: v1 kind: Service ...
随机推荐
- home_url()用法小结|wordpress函数
home_url()检索可访问当前站点的URL(推荐将<?php bloginfo('url'); ?>用<?php home_url(); ?>来替代),使用适当的协议返回' ...
- bloginfo()用法小结|wordpress函数
bloginfo()显示关于您的wordpress站点的信息,主要是从您的用户配置文件和WordPress管理屏幕的一般设置中收集的信息.它可以在模板文件的任何地方使用.这总是将结果打印到浏览器.如果 ...
- wordcloud词云模块
wordcloud词云模块 下载 pip install wordcloud 使用 import wordcloud##调用整个模块 form wordcloud import WordCloud## ...
- c#-泛型、协变、逆变
泛型简单介绍: 可以使用泛型声明的元素:类.接口.方法.委托 泛型之前:泛型之前使用object封装不同类型的参数,缺点:性能差.运行时判断类型(不安全)...泛型是在编译期间转为实际类型副本,所以性 ...
- .Net Core 获取项目所有程序集,排除Microsoft、Nuget下载的
https://www.cnblogs.com/yanglang/p/6866165.html public static List<Assembly> BaiqianAssemblies ...
- graalvm native image 试用
graalvm 提供的native 模式,可以加速应用的启动,不同可以让应用不再依赖jvm 运行时环境,但是 也有一些限制 参考 https://github.com/oracle/graal/blo ...
- Python中字符串匹配函数startswith()函数
1.函数用途含义 Python startswith() 方法用于检查字符串是否是以指定子字符串开头,如果是则返回 True,否则返回 False.如果参数 beg 和 end 指定值,则在指定范围内 ...
- Python常用经典案例
Python循环语句: 函数: 异常处理: 类和继承: 相信初学Python的我们对于好多语句都还不熟悉,经常会遇到不知道以前c语言上面的语句转换成Python语句是怎么样的,会出现错误的情况,因此 ...
- springboot修改页面不用重启的设置(idea)
1) “File” -> “Settings” -> “Build,Execution,Deplyment” -> “Compiler”,选中打勾 “Build project ...
- OCR识别的Android端实现
1.OCR简介OCR (Optical Character Recognition,光学字符识别)是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗.亮的模式确定其形状,然后用字符识别 ...