0%

Ingress是个什么东西?

其实就是一个虚拟主机转发器,以前Apache常干的东西,现在它在干,而且它干得不错,把Domain + Path映射到具体的Kubernetes的Service,这一点相当棒。

一、安装

  1. 下载ingress-nginx的安装配置文件,先访问github地址:https://github.com/kubernetes/ingress-nginx

  2. 进到deploy目录,选择nginx-0.20.0tag下载mandatory.yaml文件

  3. 修改mandatory.yaml文件,找到名叫default-http-backendDeployment,修改containerdefault-http-backend的配置,将image设为mirrorgooglecontainers/defaultbackend-amd64:1.5,这样做仅只是为了绕开

  4. 执行命令

    1
    kubectl apply -f mandatory.yaml
  5. 这样就安装好了。

  6. 验证:

    1
    2
    kubectl get pods -n ingress-nginx
    kubectl get svc -n ingress-nginx
  7. 创建Service 将ingress-nginx的Pod映射成Service以提供集群外访问:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    apiVersion: v1
    kind: Service
    metadata:
    name: ingress-nginx
    namespace: ingress-nginx
    spec:
    type: NodePort
    ports:
    - name: http
    port: 80
    nodePort: 30080
    targetPort: 80
    protocol: TCP
    - name: https
    port: 443
    nodePort: 30443
    targetPort: 443
    protocol: TCP
    selector:
    app.kubernetes.io/name: ingress-nginx
  8. 验证:

    1
    curl http://localhost:30080

二、配置

从上面的操作来看,简直是脱裤子放屁,硬生生在Service前面加一个东西,貌似没什么用。

其实……,先写到这儿,我要回家了。有空续写。

因为开发需要,我们经常要访问Kubernetes内网的某个svc / pod等,特别是数据库之类的。但是,因为Kubernetes是一个包起来的内部网络,仅只能在Node上去看,这样很不方便。

于是乎我想解决这个问题,想到了路由,想到了VPN,最不愿意得到的实现是SNAT。结果,前两者都挂了,实现不了,因为对Kubernetes了解不足,很多操作报错又无法解决。仅只有一个SNAT实现了,我去!

算了,还是暂时接受,记下来,方便以后使用。

步骤

  1. 在内网路由上设置静态路由规则,将10.0.0.0/8网络路由到Kubernetes其中一个Node,比方说:192.168.55.207。

  2. 在192.168.55.207上,增加一条iptables规则:

    1
    $ iptables -t nat -I POSTROUTING  -d 10.0.0.0/8 -j MASQUERADE

大功告成

如果不想每次 192.168.55.207重启后都做这个动作,可以将上面的命令做成一个systemd 的服务:/usr/lib/systemd/system/init-network.service

1
2
3
4
5
6
7
8
9
10
11
[Unit]
Description=Init network
After=network.target

[Service]
Type=forking
ExecStart=iptables -t nat -I POSTROUTING -d 10.0.0.0/8 -j MASQUERADE
User=root

[Install]
WantedBy=multi-user.target

安装服务:

1
2
$ systemctl enable init-network
$ systemctl start init-network

一、配置环境

/etc/sysctl.d/xxx.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
net.ipv4.ip_forward = 1
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
vm.swappiness = 0
net.ipv4.neigh.default.gc_stale_time=120

net.ipv4.conf.all.rp_filter=0
net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_announce=2
net.ipv4.conf.all.arp_announce=2


net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 1024
net.ipv4.tcp_synack_retries = 2
kernel.sysrq = 1

net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-arptables = 1

注,必须是单个ETH IP地址,否则会安装不成功。

配置Kubernetes RPM源,安装kuberet / kubeadm / kubectl

创建/etc/yum.repos.d/kubernetes.repo文件:

1
2
3
4
5
6
7
[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

安装相关应用 kuberet / kubeadm / kubectl

1
2
$ yum install -y kubelet kubeadm kubectl
$ systemctl enable kubelet && systemctl start kubelet

二、接入

1
2
kubeadm join 192.168.55.55:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:04f7a66c3f1775c0bc12ae875b164d9b121b93fe02ee004bd3b978c5facd3538

最近在CentOS 8遇到一个很头疼的问题,我已经在/etc/sysctl.conf中设置了

1
net.ipv4.ip_forward = 1

但是就是不生效,必须要在系统启动后使用iptables命令设置IP Forward。

一堆博客都是人云亦云地说在/etc/sysctl.conf配置就好,真是气人。

后来发现一段文字,解决了这个问题:

1
2
3
4
5
System default settings live in /usr/lib/sysctl.d/00-system.conf. To override those settings, enter new settings here, or in an /etc/sysctl.d/.conf file For more information, see sysctl.conf(5) and sysctl.d(5).

so, you should add into the file

/usr/lib/sysctl.d/50-default.conf

OH,God!!

原来所有在/etc/sysctl.conf的配置都会 在系统的/usr/lib/sysctl.d/00-system.conf中的配置覆写,所以,无论我在/etc/sysctl.conf配了什么,都不会生效。也可得,/usr/lib/sysctl.d/00-system.conf才是我需要配置的地方,把

1
net.ipv4.ip_forward = 1

配在/usr/lib/sysctl.d/00-system.conf即可。

学习Kubernetes是一件很痛苦的事情,你需要很多基础,而且还要学会科学上网,还要有耐心,安装一个Kubernetes更是让人头痛的事情,在对Kubernetes不了解的情况下,安装Kubernetes成了学习这门技术的门坎。

本文尽可能详细地写清楚Kubernetes Master的安装过程及环境准备,后续会有Kubernetes worker node的安装配置过程文章。

一起共勉。

Read more »

之前一直没把Kubernetes安装成功,主要原因就是因为中国的这个墙。终于,有了这个方案,过了这道坎。

1. 拉取镜像

某好人在docker repository做了kubernetes image的复制品,我们可以先把他拉取下来:

1
2
3
4
5
6
7
docker pull mirrorgooglecontainers/kube-apiserver-amd64:v1.11.3
docker pull mirrorgooglecontainers/kube-controller-manager-amd64:v1.11.3
docker pull mirrorgooglecontainers/kube-scheduler-amd64:v1.11.3
docker pull mirrorgooglecontainers/kube-proxy-amd64:v1.11.3
docker pull mirrorgooglecontainers/pause:3.1
docker pull mirrorgooglecontainers/etcd-amd64:3.2.18
docker pull coredns/coredns:1.1.3

2. 然后狸猫换太子

1
2
3
4
5
6
7
docker tag docker.io/mirrorgooglecontainers/kube-proxy-amd64:v1.11.3 k8s.gcr.io/kube-proxy-amd64:v1.11.3
docker tag docker.io/mirrorgooglecontainers/kube-scheduler-amd64:v1.11.3 k8s.gcr.io/kube-scheduler-amd64:v1.11.3
docker tag docker.io/mirrorgooglecontainers/kube-apiserver-amd64:v1.11.3 k8s.gcr.io/kube-apiserver-amd64:v1.11.3
docker tag docker.io/mirrorgooglecontainers/kube-controller-manager-amd64:v1.11.3 k8s.gcr.io/kube-controller-manager-amd64:v1.11.3
docker tag docker.io/mirrorgooglecontainers/etcd-amd64:3.2.18 k8s.gcr.io/etcd-amd64:3.2.18
docker tag docker.io/mirrorgooglecontainers/pause:3.1 k8s.gcr.io/pause:3.1
docker tag docker.io/coredns/coredns:1.1.3 k8s.gcr.io/coredns:1.1.3

搞定。

最近要配一个Kubernetes集群,Node OS选的是CentOS 8,但是发现安装Docker出现了一些问题,这里记录一下解决方法

1. 清理系统环境,去除曾经安装的Docker组件及程序

1
2
3
4
5
6
7
8
$ yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine

2. 安装相应环境及工具

1
2
3
$ yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
1
2
3
$ yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo

3. 执行安装

1
$ yum install docker-ce docker-ce-cli containerd.io

在这一步会遇到以下问题:

1
2
3
4
5
6
7
8
9
10
11
12
Docker CE Stable - x86_64                                                                                                       4.7 kB/s |  21 kB     00:04
Last metadata expiration check: 0:00:01 ago on Wed 25 Dec 2019 10:13:24 PM EST.
Error:
Problem: package docker-ce-3:19.03.5-3.el7.x86_64 requires containerd.io >= 1.2.2-3, but none of the providers can be installed
- cannot install the best candidate for the job
- package containerd.io-1.2.10-3.2.el7.x86_64 is excluded
- package containerd.io-1.2.2-3.3.el7.x86_64 is excluded
- package containerd.io-1.2.2-3.el7.x86_64 is excluded
- package containerd.io-1.2.4-3.1.el7.x86_64 is excluded
- package containerd.io-1.2.5-3.1.el7.x86_64 is excluded
- package containerd.io-1.2.6-3.3.el7.x86_64 is excluded
(try to add '--skip-broken' to skip uninstallable packages or '--nobest' to use not only best candidate packages)

这里提示的是containerd.io的版本问题,提示说用--nobet来跳过错误,但是这样做的话就会使得安装Kubernetes不成功,因为containerd.io的版本不匹配。

解决方法如下,安装符合版本要求的containerd.io:

1
$ dnf install https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.6-3.3.el7.x86_64.rpm

再次执行安装:

1
yum install docker-ce docker-ce-cli containerd.io

4. 安装后配置

为什么要配置?

因为Docker默认安装有一些问题:

  1. 数据目录没有指定,导致都放在/中,这样磁盘很快耗尽,特别是开发迭代过程,大量的版本更新,image一下子就撑爆/分区。
  2. 没有暴露 HTTP API,有需求时可以加上这个,以便于远程操作docker。
  3. 指定insecure-repository ,以方便我们访问非安全协议的image repository。

systemd的配置目录在/usr/lib/systemd/system,所以进到这个目录里,修改docker.service即可修改Dockerd的启动配置。

我们只配好一行就行:

1
ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375 -g /deploy/docker --containerd=/run/containerd/containerd.sock

这里指定了暴露2375端口允许远端访问docker,同时指定数据目录为/deploy/docker

刷新服务配置

1
$ systemctl daemon-reload

启动服务

1
$ systemctl start docker.service

搞定。

一直关注于业务实现及业务架构设计,很少去关注一些运营方面的东西,但是面试架构师所需要的正是运营方面的知识,这样的短板会让我在面试的时候很尴尬。

业务架构师封神,运营架构师则是猪一般,真不应该。

一、前言

我们都喜欢使用SpringBoot来开发Java Application,随着使用中间件越来越多,Application的健康状态及用量状态变成了我们所关心的事情,因为其中任何一个连接中间件的状态都反应着Application的健康,影响着应用的正常运行。

所以,SpringBoot提供了相关的Starter来实现这个功能,结合Prometheus和Grafana,即可方便地监控应用的工作状态。

Read more »

一、Hibernate PersitentMap 在SpringBoot中使用Dozer进行类型转换时的Bug

我们知道,Dozer已经很久没有人维护了,其实它是有一些bug的,但是却因没人维护导致这些bug日久无人修。

前些天在JPA中使用Map作为Entity属性时,在到达Dozer转换成VO的时候,抛出了no session的错误。

但是我已经给SpringBoot加上了open-in-view的属性,应该不会出现这个问题的,所以经过多番配置可以排出open-in-view的原因。后查看dozer的源码,才发现,其实是dozer的问题。

二、原因所在

在entity中,我们的代码是这样的:

1
2
3
class User {
private Map<String, String> settings;
}

在vo中,我们的代码是这样的:

1
2
3
class UserVO {
private Map<String, String> settings;
}

由于使用Hibernate作为JPA的provider,User实体在加载出来之后,settings是一个PersitentMap。

但是在dozer对po->vo时,发现vo的settings为空,则会克隆一个po的settings到vo,也就是说,这时vo的settings是一个PersitentMap。又因为转化成JSON的时候是在view之外,所以就没有session,导致no session的错误异常。

Read more »