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私服

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 

用于搜索所需要应用的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

参考文档

官网 简化Kubernetes应用部署工具-Helm之应用部署 Helm 用户指南

点我阅读更多...

Github blog 搭建

GitHub Blog

忽然发现写blog很好,可以记录自己的成长过程,采用GitHub Pages方式构建blog,不用服务器感觉真好!

选择一个模版

Jekyll是Github默认的模板系统,你可以在Jekyll Themes找到你喜欢的模版fork下来,进行一系列配制就好了。 博主选择的是 jekyll-TeXt,后面操作都基于该模版。

设置 Repository Settings

  1. 设置Repository name为”{自己的githup name}.githup.io”,设置成功后就可以在浏览输入Repository name访问自己blog拉;
  2. 设置开启Issues ,后面评论要用;

    网站配制

    找到网站根目录下的_config.yml,可以进行相关配制

    基础配制

  3. 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 描述
    
  4. 语言和时区
    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
---

参考文档

TeXt Theme 官方文档

点我阅读更多...

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;
    }

}

参考文章

HTTP访问控制(CORS)

点我阅读更多...

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
点我阅读更多...