分类 Linux 下的文章

CentOS 7 使用kubeadm安装kubernetes1.7.2集群

更新时间

ntpdate cn.pool.ntp.org
hwclock -w

此处建议将更新时间加入到任务计划中定时执行, k8s集群内时间不一致是会出问题…

  1. 添加kubernetes仓库源

    cat <<EOF > /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
    EOF
    
  2. 更新&&禁用防火墙

    yum update -y
    systemctl disable firewalld && systemctl stop firewalld && systemctl status firewalld
    
  3. 开启sysctl参数

    net.bridge.bridge-nf-call-iptables = 1
    net.bridge.bridge-nf-call-ip6tables = 1
    
  4. 安装brctl

    yum install bridge-utils -y
    
  5. 安装kubeadm等k8s组件

    yum install kubelet kubeadm kubectl kubernetes-cni -y
    
  6. 安装docker

    yum install docker # 1.12.6版本
    
  7. 安装k8s

    kubeadm init --pod-network-cidr=10.244.0.0/16 --kubernetes-version v1.7.2
    
  8. 创建网络

    kubectl create -f \
    https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel-rbac.yml
    kubectl create -f  \
    https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
    
  9. 修改hairpin-mode 让service 可以访问自己

    临时解决:

    /sys/class/net/cni0/brif
    
    for intf in $(ip link list | grep veth | cut -f2 -d:|awk -F "@" '{print $1}'|awk -F " " '{print $1}') ; do brctl hairpin cni0 $intf on; done
    
    

    方法一:

    # 此方法在网络插件重新创建后会失效.
    
    /etc/cni/net.d/10-flannel.conf
    {
      "name": "cbr0",
      "type": "flannel",
      "delegate": {
        "isDefaultGateway": true,
        "hairpinMode": true
      }
    }
    

    方法二:
    修改ConfigMap
    保存修改后重新创建

    [root@fykbnode-hzba-2 ~]# kubectl get cm/kube-flannel-cfg -n kube-system -o yaml
    apiVersion: v1
    data:
    cni-conf.json: |
    {
      "name": "cbr0",
      "type": "flannel",
      "delegate": {
        "isDefaultGateway": true,
        "hairpinMode": true
      }
    }
    net-conf.json: |
    {
      "Network": "10.244.0.0/16",
      "Backend": {
        "Type": "vxlan"
      }
    }
    kind: ConfigMap
    metadata:
    creationTimestamp: 2017-09-12T11:40:18Z
    labels:
    app: flannel
    tier: node
    name: kube-flannel-cfg
    namespace: kube-system
    resourceVersion: "97"
    selfLink: /api/v1/namespaces/kube-system/configmaps/kube-flannel-cfg
    uid: 26bfe3f8-97af-11e7-9a7e-246e9671187c
    
  10. 测试

kubectl create namespace sock-shop
kubectl create -f https://github.com/microservices-demo/microservices-demo/blob/master/deploy/kubernetes/complete-demo.yaml?raw=true
  1. 网络问题
# 当安装时如果有多次kubeadm reset 情况, 请执行以下三条命令清除网络设置... 不然会造成网络混乱冲突, 导致集群内网络互相不通...
ifconfig  cni0 down
brctl delbr cni0
ip link delete flannel.1

OpenResty使用upsync模块提供灰度发布

nginx upstream 动态加载, 借助于服务注册中心…. 改天完善文档….

下载openresty

https://openresty.org/download/openresty-1.11.2.4.tar.gz

clone check补丁

git clone https://github.com/xiaokai-wang/nginx_upstream_check_module.git

下载openssl

wget https://www.openssl.org/source/openssl-1.0.2e.tar.gz

打补丁

patch -p0 < /root/nginx_upstream_check_module/check_1.11.1+.patch
cd /root/openresty-1.11.2.4/bundle/nginx-1.11.2

/root/openresty-1.11.2.4/bundle/nginx-1.11.2/src/http/modules/ngx_http_upstream_hash_module.c
/root/openresty-1.11.2.4/bundle/nginx-1.11.2/src/http/modules/ngx_http_upstream_ip_hash_module.c
/root/openresty-1.11.2.4/bundle/nginx-1.11.2/src/http/modules/ngx_http_upstream_least_conn_module.c
/root/openresty-1.11.2.4/bundle/nginx-1.11.2/src/http/ngx_http_upstream_round_robin.c
/root/openresty-1.11.2.4/bundle/nginx-1.11.2/src/http/ngx_http_upstream_round_robin.h

编译

./configure --prefix=/usr/local/openresty --with-openssl=/root/openssl-1.0.2e --with-http_v2_module --add-module=/root/nginx_upstream_check_module

gmake && gmake install 

ELK日志集成

ELK介绍

  • Logstash负责从每台机器抓取日志数据,对数据进行格式转换和处理后,输出到Elasticsearch中存储。
  • Elasticsearch是一个分布式搜索引擎和分析引擎,用于数据存储,可提供实时的数据查询。
  • Kibana是一个数据可视化服务,根据用户的操作从Elasticsearch中查询数据,形成相应的分析结果,以图表的形式展现给用户。

阅读剩余部分 –

CentOS安全检查工具:chkrootkit,rkhunter

1. rootkit检查

Rootkit是一种特殊的恶意软件,它的功能是在安装目标上隐藏自身及指定的文件、进程和网络链接等信息,比较多见到的是Rootkit一般都和木马、后门等其他恶意程序结合使用。
可以使用chkrootkit来检查
官网http://www.chkrootkit.org

下载安装:

wget ftp://ftp.pangeia.com.br/pub/seg/pac/chkrootkit.tar.gz
tar zxvf chkrootkit.tar.gz
cd chkrootkit-0.50
make sense
./chkrootkit

2.黑客入侵后会植入一些木马程序,会替换部分系统命令

使用Rootkit Hunter 检查

wget http://cznic.dl.sourceforge.net/project/rkhunter/rkhunter/1.4.2/rkhunter-1.4.2.tar.gz
tar zxvf rkhunter-1.4.2.tar.gz 
cd rkhunter-1.4.2 
./installer.sh --install 
rkhunter -c

3.RPM check 检查

系统完整性也可以通过rpm自带的-Va来校验检查所有的rpm软件包,有哪些被篡改了,防止rpm也被替换,上传一个安全干净稳定版本rpm二进制到服务器上进行检查:

rpm -Va > rpm.log

如果一切均校验正常将不会产生任何输出。如果有不一致的地方,就会显示出来。输出格式是8位长字符串, c 用以指配置文件, 接着是文件名. 8位字符的每一个 用以表示文件与RPM数据库中一种属性的比较结果 。. (点) 表示测试通过。.下面的字符表示对RPM软件包进行的某种测试失败:

显示字符错误源

5 MD5 校验码
S 文件尺寸
L 符号连接
T 文件修改日期 
D 设备 
U 用户 
G 用户组 
M 模式e (包括权限和文件类型)

Docker 版本升级

在CentOS中,yum安装最高版本为1.5,所以,我们需要从官网下载最新的升级
CentOS中docker升级版本非常简单

wget https://get.docker.io/builds/Linux/x86_64/docker-latest -O docker

mv -f docker /usr/bin/docker

chmod  +x  /usr/bin/docker

service docker  restart

chkconfig docker on

Nginx配置个性二级域名

最近需要配置下个性化二级域名.
效果:
访问的URL http://custom.insoz.com
实际的URL http://www.insoz.com/auth/custom

我们的做法就是通过服务器配置,将访问的url转换为实际的url

下面我们来用nginx配置。配置如下:

server {
        listen       80;
        server_name  *.insoz.com;
        if ( $host ~* (\b(?!www\b)\w+)\.\w+\.\w+ ) {
            set $subdomain $1;
        }
        location / {
            rewrite ^/$ /auth/$subdomain last;
            proxy_pass http://www.insoz.com/;
        }
    }

其中的if,是用于过滤某些特殊的二级域名,比如www,然后获取二级域名的变量值。

rewrite转化为对应的目录

rewrite ^/$ /auth/$subdomain last;

再加上nginx的反向代理功能:

proxy_pass http://www.insoz.com/;

就可以实现了。

这样配置之后,除了if中过滤的二级域名,其他的二级域名{sudomain}.insoz.com,对于服务器,其真实的路径都是www.insoz.com/auth/{sudomain}。

如果url有多种路径规则,则需要一一进行配置。

apache,nginx,php隐藏版本号

当黑客入侵一台服务器时,首先会”踩点”, 这里的”踩点”,指的是了解服务器中运行的一些服务的详细情况,比如说:版本号,当黑客知道相应服务的版本号后,就可以寻找该服务相应版本的一些漏洞来入侵,攻击,所以我们需要隐藏这些版本号来避免一些不必要的问题

我们来测试一下

insoz:~ insoz$ curl -I http://127.0.0.1/phpinfo.php
HTTP/1.1 200 OK
Server: nginx/1.5.0
Date: Thu, 18 Jun 2015 02:39:32 GMT
Content-Type: text/html
Connection: keep-alive
Vary: Accept-Encoding
X-Powered-By: PHP/5.3.1

可以看到我们的服务器nginx和php版本都暴露了. 下面我们来看隐藏的方法

首先来看nginx中隐藏版本号的方法:
在nginx配置文件nginx.conf中,加入以下代码

server_tokens off;

apache中隐藏版本号的方法:
在apache配置文件httpd.conf中,加入以下代码

ServerTokens Prod
ServerSignature Off

再来看php中隐藏版本号的方法:
在php配置文件php.ini中,加入以下代码

expose_php = Off

好了,修改完毕重启服务,我们再来测试一下:

insoz:~ insoz$ curl -I http://127.0.0.1//phpinfo.php
HTTP/1.1 200 OK
Server: nginx
Date: Thu, 18 Jun 2015 02:41:47 GMT
Content-Type: text/html
Connection: keep-alive
Vary: Accept-Encoding