K8s升级
k8s 升级
目前公司k8s集群是1.11.1版本,尝试了升级到1.11.2,为今后升级探个道
基本情况
公司目前集群部署在阿里云上是3主2从,升级根据官方文档
升级相关控制组件
任意一点Master上安装新版Kubeadm
export VERSION=$(curl -sSL https://dl.k8s.io/release/stable.txt) # or manually specify a released Kubernetes version
export ARCH=amd64 # or: arm, arm64, ppc64le, s390x
curl -sSL https://dl.k8s.io/release/${VERSION}/bin/linux/${ARCH}/kubeadm > /usr/bin/kubeadm
chmod a+rx /usr/bin/kubeadm
执行命令查看一下各组件当前版本与升级版本
kubeadm upgrade plan
确认无误执行升级,注意升级的版本号
kubeadm upgrade apply v1.11.2
升级Master and node安装包
新版本只需要升级kubelet and kubeadm,该操作需要在所有的节点上执行
排除节点,使节点不参加调度
如果nodename是hostname就可以直接执行以下
export nodename=`hostname`
kubectl drain $nodename --ignore-daemonsets
执行升级
yum upgrade -y kubelet kubeadm --disableexcludes=kubernetes
如遇墙的问题,可以使用阿里镜像升级
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
重启与配制kubelet
所有node都需要执行下面的步骤
如果是从节点,需要升级kubelet config:
这一步Master node是不需要执行的
sudo kubeadm upgrade node config --kubelet-version $(kubelet --version | cut -d ' ' -f 2)
由于升级kubelte后,/etc/sysconfig/kubelet 文件被清空,如果有相关配制需要重新写入/etc/sysconfig/kubelet
各家配制不一样,注意替换配制内容
cat <<EOF > /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--enable-controller-attach-detach=false --cgroup-driver=cgroupfs --pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google_containers/pause-amd64:3.1"
EOF
sudo systemctl daemon-reload
sudo systemctl restart kubelet
检查一下kubelet状态
systemctl status kubelet
确认kubelet状态正常后,重新加入node
kubectl uncordon $nodename
最后确认节点状态
kubectl get nodes
Helm chart 开发
Helm 私服
Helm私服
Helm 私服
对于准备用Helm来安装与管理线上服务的公司,搭建一个公司内部的Helm Chart Repositry是必不可少的,本例使用ChartMuseum来搭建。
本地安装
安装
# on Linux
curl -LO https://s3.amazonaws.com/chartmuseum/release/latest/bin/linux/amd64/chartmuseum
# on macOS
curl -LO https://s3.amazonaws.com/chartmuseum/release/latest/bin/darwin/amd64/chartmuseum
# on Windows
curl -LO https://s3.amazonaws.com/chartmuseum/release/latest/bin/windows/amd64/chartmuseum
chmod +x ./chartmuseum
mv ./chartmuseum /usr/local/bin
启动
ChartMuseum 启动方式主要在于对存储的选择,ChartMuseum支持很多种存储方式:本地、Amazon S3、Google Cloud Storage、Alibaba Cloud OSS Storage 等等,这里我选择了阿里OSS。
在阿里云开通OSS并新建存储空间 my-oss-bucket,新建子用户并授与AliyunOSSFullAccess权限,拿到新建用户的AccessKey And Secret
写入AccessKey And Secret到环境变量
export ALIBABA_CLOUD_ACCESS_KEY_ID=xxx
export ALIBABA_CLOUD_ACCESS_KEY_SECRET=xxx
执行启动命令
chartmuseum --debug --port=8080 \
--storage="alibaba" \
--storage-alibaba-bucket="my-oss-bucket" \
--storage-alibaba-prefix="" \
--storage-alibaba-endpoint="oss-cn-beijing.aliyuncs.com"
使用
本地添加repository
helm repo add my-repository http://localhost:8080
查找该repository下的charts
helm search my-repository/
安装 chart
helm install my-repository/mychart
上传Chart
github上有介绍curl命令方式上传这里略过,直接介绍通过helm-push插件方式上传
helm-push
helm-push是helm命令的插件,安装过后就可以直接执行helm push
helm plugin install https://github.com/chartmuseum/helm-push
上传
helm push mychart/ my-repository
权限控制
支持的权限控制有Basic Auth、Token,这里选择Basic Auth
首先启动命令要添加AUTH_ANONYMOUS_GET=true,并将用户名和密码设置在环境变量中
export HELM_REPO_USERNAME="myuser"
export HELM_REPO_PASSWORD="mypass"
chartmuseum --debug --port=8080 \
--storage="alibaba" \
--storage-alibaba-bucket="my-oss-bucket" \
--storage-alibaba-prefix="" \
--storage-alibaba-endpoint="oss-cn-beijing.aliyuncs.com" \
--AUTH_ANONYMOUS_GET=true
在repo url中添加username/password,如:http://myuser:mypass@my.chart.repo.com
其它安装方式
docker
docker run --rm -it \
-p 8080:8080 \
-e PORT=8080 \
-e DEBUG=1 \
-e STORAGE="alibaba" \
-e STORAGE_ALIBABA_BUCKET="my-oss-bucket" \
-e STORAGE_ALIBABA_PREFIX="" \
-e STORAGE_ALIBABA_ENDPOINT="oss-cn-beijing.aliyuncs.com" \
-e ALIBABA_CLOUD_ACCESS_KEY_ID="xxx" \
-e ALIBABA_CLOUD_ACCESS_KEY_SECRET="xxx" \
chartmuseum/chartmuseum:latest
Helm Chart
既然我们使用k8s和Helm,用该方式安装肯定是极好的,如果不会用可以查看一下人家的Chart怎么写的
先写一个custom.yaml用来配制chart
env:
open:
#开启api
DISABLE_API: false
ALLOW_OVERWRITE: true
STORAGE: alibaba
STORAGE_ALIBABA_BUCKET: my-oss-bucket
STORAGE_ALIBABA_PREFIX:
STORAGE_ALIBABA_ENDPOINT: oss-cn-shenzhen-internal.aliyuncs.com
secret:
ALIBABA_CLOUD_ACCESS_KEY_ID: "xxx" ## alibaba OSS access key id
ALIBABA_CLOUD_ACCESS_KEY_SECRET: "xxx" ## alibaba OSS access key secret
BASIC_AUTH_USER: myuser
BASIC_AUTH_PASS: mypass
ingress:
#开启 ingress
enabled: true
## Chartmuseum Ingress annotations
##
annotations:
kubernetes.io/ingress.class: nginx
kubernetes.io/tls-acme: "true"
## Chartmuseum Ingress hostnames
## Must be provided if Ingress is enabled
##
hosts:
#访问的域名
helm.xxx.xxx:
- /charts
- /api/charts
- /api/prov
- /index.yaml
执行安装
helm repo add stable https://kubernetes-charts.storage.googleapis.com
helm install -f custom.yaml stable/chartmuseum
参考文档
Helm的安装与使用
Helm
Helm是Kubernetes的一个包管理工具,用来简化Kubernetes应用的部署和管理。Helm的官方源下有很多应用的Chart,我们可以利用Helm快速部署这些应用。最重要的是对于公司自己的应用也可以编写自己的Chart,做到一键部署整个应用集群。
Helm有如下几个基本概念:
- Chart: 是Helm管理的安装包,里面包含需要部署的安装包资源。可以把Chart比作CentOS yum使用的rpm文件。每个Chart包含下面两部分: 包的基本描述文件Chart.yaml 放在templates目录中的一个或多个Kubernetes manifest文件模板
- Release:是chart的部署实例,一个chart在一个Kubernetes集群上可以有多个release,即这个chart可以被安装多次
- Repository:chart的仓库,用于发布和存储chart
helm的组成
Helm由两部分组成,客户端helm和服务端tiller。
- tiller运行在Kubernetes集群上,管理chart安装的release
- helm是一个命令行工具,可在本地运行,一般运行在CI/CD Server上。
安装Helm
根据官方文档安装
wget https://storage.googleapis.com/kubernetes-helm/helm-v2.9.1-linux-amd64.tar.gz
tar -zxvf helm-v2.9.1-linux-amd64.tar.gz
mv linux-amd64/helm /usr/local/bin/helm
helm help
helm version
初始化helm 并在K8s集群上部署Tiller,需要所在服务器可以正常使用kubectl操作k8s集群,由于墙的问题使用了阿里云的镜像
helm init --upgrade -i registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.9.1 --stable-repo-url https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
查看 tiller 是否正常运行
kubectl get pod -n kube-system -l app=helm
NAME READY STATUS RESTARTS AGE
tiller-deploy-98f7f7564-xh24t 1/1 Running 0 3d
添加tiller需要的RBAC权限
kubectl create serviceaccount --namespace kube-system tiller
kubectl create clusterrolebinding tiller-cluster-rule --clusterrole=cluster-admin --serviceaccount=kube-system:tiller
kubectl patch deploy --namespace kube-system tiller-deploy -p '{"spec":{"template":{"spec":{"serviceAccount":"tiller"}}}}'
基础操作
helm repo
Helm 可以设置多个存储库,首次安装预配置为使用官方 Kubernetes chart 存储库 repo,由于墙的原因上面安装命令已经使用阿里存储库替换了预置的官方库,我们可以使用helm repo操作存储存库
查看存储库
helm repo list
添加一个存储库
helm repo add local http://127.0.0.1:8879/charts
更新存储库
helm repo update
helm search
用于搜索所需要应用的chart
helm search mysql
NAME CHART VERSION APP VERSION DESCRIPTION
incubator/mysql-broker 0.1.0 A Helm chart for Kubernetes
incubator/mysqlha 0.3.0 5.7.13 MySQL cluster with a single master and zero or ...
stable/mysql 0.3.0 Fast, reliable, scalable, and easy to use open-...
helm install
搜索到chart后,可以通过Helm install命令部署chart,部署时指定chart名及Release(部署的实例)名:
helm install --name my-mysql --namespace myNamespace stable/mysql
如果有配制需要覆盖,可以通过指定配置文件
helm install --name my-mysql --namespace myNamespace -f config.yaml stable/mysql
或者通过–set key=value形式:
helm install --name my-mysql --namespace myNamespace --set service.port=3307 stable/mysql
如果对配制不太不清楚可以到官方库去找一下chart说明
helm list
chart 安装后,通helm list查看
helm list
NAME REVISION UPDATED STATUS CHART NAMESPACE
my-chartmuseum 1 Fri Aug 3 14:27:52 2018 DEPLOYED chartmuseum-1.6.0 thinker-common
如果想看所有安装过的Chart(包括被删除的)
helm list --all
NAME REVISION UPDATED STATUS CHART NAMESPACE
bold-elephant 1 Tue Jul 31 15:34:34 2018 DELETED hello-svc-0.1.0 default
my-chartmuseum 1 Fri Aug 3 14:27:52 2018 DEPLOYED chartmuseum-1.6.0 thinker-common
saccharum 2 Fri Aug 3 16:51:56 2018 DELETED saccharum-chart-1.0.0 saccharum-production
wordpress-test 1 Tue Jul 31 15:11:52 2018 DELETED wordpress-0.6.13 default
helm status
查看安装的Chart状态
helm status my-chartmuseum
helm delete
删除chart
helm del my-chartmuseum
确认chart是否删除:
helm ls -a my-chartmuseum
delete 只会删除k8s线上部署,部署记录会保留,可以使用helm hist查看
helm hist my-chartmuseum
以恢复一个已经删除的release:
helm rollback --debug my-chartmuseum 1
如果希望彻底删除一个release,可以用如下命令:
helm delete --purge my-chartmuseum
版本管理
更新release
Helm使用helm upgrade更新已安装的release:
helm upgrade mysql -f mysql/values.yaml --set resources.requests.memory=1024Mi mysql
# 如果只需要修改 resources.requests.memory=1024Mi ,可以加入 --reuse-values 保留原有 values
helm upgrade mysql --reuse-values --set resources.requests.memory=1024Mi mysql
#查看当前 values
helm get values mysql
查看指定release的历史部署版本信息:
helm hist mysql
查看指定release的历史版本部署时部分配置信息,以resources.requests.memory为例,符合查看部署符合预期:即第一次部署resources.requests.memory设置为512Mi,第二次的升级resources.requests.memory设置为1024Mi:
helm get --revision 1 mysql
resources:
requests:
cpu: 100m
memory: 512Mi
helm get --revision 2 mysql
resources:
requests:
cpu: 100m
memory: 1024Mi
版本回滚
可以会滚到某个指定版本
helm rollback --debug mysql 1
参考文档
K8落地
点我阅读更多...Github blog 搭建
GitHub Blog
忽然发现写blog很好,可以记录自己的成长过程,采用GitHub Pages方式构建blog,不用服务器感觉真好!
选择一个模版
Jekyll是Github默认的模板系统,你可以在Jekyll Themes找到你喜欢的模版fork下来,进行一系列配制就好了。 博主选择的是 jekyll-TeXt,后面操作都基于该模版。
设置 Repository Settings
- 设置Repository name为”{自己的githup name}.githup.io”,设置成功后就可以在浏览输入Repository name访问自己blog拉;
- 设置开启Issues ,后面评论要用;
网站配制
找到网站根目录下的_config.yml,可以进行相关配制
基础配制
- Site Settings
text_color_theme: default #模版颜色 "default" (default), "dark", "forest", "ocean", "chocolate", "orange" url: # the base hostname & protocol for your site e.g. https://www.someone.com baseurl: # does not include hostname title: 标题 description: > # this means to ignore newlines until "Language & timezone" blog 描述
- 语言和时区
lang: zh # the language of your site, "en" (default, English), "zh"(简体中文), "zh-Hans"(简体中文), "zh-Hant"(繁體中文) timezone: # see https://en.wikipedia.org/wiki/List_of_tz_database_time_zones for the available values
3.作者信息
author: name: 邓伟 email: dengwei@thinker.vc # your Email address e.g. someone@site.com facebook: # your Facebook username twitter: # your Twitter username github: jamesDeng # your GitHub username linkedin: # your Linkedin username googleplus: # your Google+ username weibo: # your Weibo username douban: # your Douban username
4.GitHub 源码仓库,不是很理解文档上的说明,我配制成自己githup Repository,其格式为 项目所有者 ID / 项目名称
repository: jamesDeng/jamesDeng.github.io repository_tree: master
评论
为了没有墙的问题,采用的的gitalk,首先需要一个 GitHub Application,点击这里申请,然后将相应的参数添加到 _config.yml 配置中
gitalk:
clientID: # GitHub Application Client ID
clientSecret: # GitHub Application Client Secret
repository: xxxx.github.io # GitHub repo
owner: xxxx # GitHub repo owner
admin: # GitHub repo owner and collaborators, only these guys can initialize GitHub issues, IT IS A LIST.
- "xxxx"
# - your GitHub Id
这里需要注意的是gitalk是基于github Issues的,所以前面有提示项目Issues必须是打开的,然后你需要在页面的头信息里设置 key 属性来开启该页的评论。
点击量
TeXt 使用 LeanCloud 作为点击量功能的后台服务。你需要建立一个应用,然后在应用中建立一个 Class,之后将必要的信息填写到 _config.yml 文件中。下面详细介绍其操作步骤。
点击这里进行主页,点击免费试用进行注册和登录,点击创建应用选择开发版 点击应用上的存储进行存储管理页面,点击创建Class,设置数据条目的ACL 权限为无限制 最后点击应用面板右侧的“设置”,点击“应用 Key” 选项,即可得到对应的 APP ID 和 APP KEY:
leancloud:
app_id: kN1v8C5Og8KFAqD9xFpnpbRW-gzGzoHsz # LeanCloud App id
app_key: z6gbTJXiyBeAtFz87iluVvLA # LeanCloud App key
app_class: click_num # LeanCloud App class
文章
创建文章
发表一篇新文章,你所需要做的就是在 _posts 文件夹中创建一个新的文件。文件名的命名非常重要。Jekyll 要求一篇文章的文件名遵循下面的格式:
年-月-日-标题.MARKUP
YAML 头信息
---
layout: article #布局,具体请看官方文档
key: k8s_aliyun_install #唯一标识文章,评论和点击量都需要用到
category: k8s
tags: k8s #标签,用于归档的时候给文章分类
title: k8s 阿里云安装
modify_date: 2018-6-1 18:13:00
---
参考文档
Api 的跨域支持
设置API支持跨请求
公司最近尝试用h5来做简单的APP(h5套个Andorid壳),使用的vue.js来写,后台是开放平台方式需要支持跨域。
后台基础框架
使用Spring mvc+Spring Security oauth2+spring boot来做的API框架
spring mvc 设置支持
需要spring mvc 4.2及以上版本
@Configuration
public class WebConfiguration extends WebMvcConfigurerAdapter{
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**").allowedOrigins("*")
.allowedMethods("GET", "HEAD", "POST","PUT", "DELETE", "OPTIONS")
.allowCredentials(false).maxAge(3600);
}
}
Spring Security oauth2 设置支持
@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
//重点是调用http.csrf()开启对csrf的支持
http
.csrf().disable()
.authorizeRequests()
.antMatchers("/login", "/logout.do").permitAll()
.antMatchers("/**").authenticated()
.and()
.formLogin()
.loginProcessingUrl("/login.do")
.usernameParameter("name")
.loginPage("/login")
.and()
.logout()
//To match GET requests we have to use a request matcher.
.logoutRequestMatcher(new AntPathRequestMatcher("/logout.do"));
//.and()
//.userDetailsService(userDetailsService());
http.sessionManagement().maximumSessions(1);
}
@Bean
public FilterRegistrationBean corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
config.addAllowedOrigin("*");
config.addAllowedHeader("*");
config.addAllowedMethod("*");
config.setMaxAge(3600L);
source.registerCorsConfiguration("/**", config);
FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source));
bean.setOrder(Ordered.HIGHEST_PRECEDENCE);
return bean;
}
}
参考文章
K8s Ingress Https证书说明
自建证书
生成 CA 自签证书
mkdir cert && cd cert
openssl genrsa -out ca-key.pem 2048
openssl req -x509 -new -nodes -key ca-key.pem -days 10000 -out ca.pem -subj "/CN=kube-ca"
编辑 openssl 配置
cp /etc/pki/tls/openssl.cnf .
vim openssl.cnf
# 主要修改如下
[req]
req_extensions = v3_req # 这行默认注释关着的 把注释删掉
# 下面配置是新增的
[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = dashboard.mritd.me
DNS.2 = kibana.mritd.me
生成证书
openssl genrsa -out ingress-key.pem 2048
openssl req -new -key ingress-key.pem -out ingress.csr -subj "/CN=kube-ingress" -config openssl.cnf
openssl x509 -req -in ingress.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out ingress.pem -days 365 -extensions v3_req -extfile openssl.cnf
添加证书到k8s
kubectl create secret tls ingress-secret --key ./ingress-key.pem --cert ./ingress.pem -n kube-system
添加阿里生成证书
kubectl create secret tls kubernetes-dashboard-certs --key ./***.key --cert ./****.pem -n kube-system