kubernetes 1.8 高可用安装(三)

3、master 组件安装(etcd/api-server/controller/scheduler)

3.1 etcd集群安装

确定你要安装的master机器, 上面安装rpm包,配置kubelet

注意:
所有的image,我都已经放到docker hub仓库,需要的可以去下载

https://hub.docker.com/u/foxchan/

安装rpm包

yum localinstall -y kubectl-1.8.0-1.x86_64.rpm kubelet-1.8.0-1.x86_64.rpm kubernetes-cni-0.5.1-1.x86_64.rpm

创建manitest目录

mkdir -p /etc/kubernetes/manifests

修改kubelet配置

/etc/systemd/system/kubelet.service.d/kubelet.conf

[Service]
Environment="KUBELET_SYSTEM_PODS_ARGS=--pod-manifest-path=/etc/kubernetes/manifests --allow-privileged=true"
Environment="KUBELET_NETWORK_ARGS=--network-plugin=cni --cni-conf-dir=/etc/cni/net.d --cni-bin-dir=/opt/cni/bin"
Environment="KUBELET_DNS_ARGS=--cluster-dns=10.96.0.12 --cluster-domain=cluster.local"
Environment="KUBELET_CADVISOR_ARGS=--cadvisor-port=0"
Environment="KUBELET_CGROUP_ARGS=--cgroup-driver=cgroupfs"
Environment="KUBELET_EXTRA_ARGS=--v=2  --pod-infra-container-image=foxchan/google_containers/pause-amd64:3.0 --fail-swap-on=false"
ExecStart=
ExecStart=/usr/bin/kubelet $KUBELET_SYSTEM_PODS_ARGS $KUBELET_NETWORK_ARGS $KUBELET_DNS_ARGS  $KUBELET_CADVISOR_ARGS $KUBELET_CGROUP_ARGS $KUBELET_CERTIFICATE_ARGS $KUBELET_EXTRA_ARGS

注意:

–cluster-dns=10.96.0.12 这个IP自己规划,记得和创建证书时候的IP段保持一致

–fail-swap-on=false 1.8开始,如果机器开启了swap,kubulet会无法启动,默认参数是true

启动kubelet

systemctl daemon-reload
systemctl restart kubelet

3.2 安装etcd集群

创建etcd.yaml,并放到 /etc/kubernetes/manifests

注意:

提前创建日志文件,便于挂载

/var/log/kube-apiserver.log
/var/log/kube-etcd.log
/var/log/kube-controller-manager.log
/var/log/kube-scheduler.log

#根据挂载配置创建相关目录
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    component: etcd
    tier: control-plane
  name: etcd-server
  namespace: kube-system
spec:
  hostNetwork: true
  containers:
  - image: foxchan/google_containers/etcd-amd64:3.0.17
    name: etcd-container
    command:
    - /bin/sh
    - -c
    - /usr/local/bin/etcd
      --name=etcd0
      --initial-advertise-peer-urls=http://master_IP:2380
      --listen-peer-urls=http://master_IP:2380
      --advertise-client-urls=http://master_IP:2379
      --listen-client-urls=http://master_IP:2379,http://127.0.0.1:2379
      --data-dir=/var/etcd/data
      --initial-cluster-token=emar-etcd-cluster
      --initial-cluster=etcd0=http://master_IP1:2380,etcd1=http://master_IP2:2380,etcd2=http://master_IP3:2380
      --initial-cluster-state=new 1>>/var/log/kube-etcd.log 2>&1
    livenessProbe:
      failureThreshold: 8
      httpGet:
        host: 127.0.0.1
        path: /health
        port: 2379
        scheme: HTTP
      initialDelaySeconds: 15
      timeoutSeconds: 15
    volumeMounts:
    - mountPath: /var/log/kube-etcd.log
      name: logfile
    - mountPath: /var/etcd
      name: varetcd
    - mountPath: /etc/ssl/certs
      name: certs
    - mountPath: /etc/kubernetes/
      name: k8s
      readOnly: true
  volumes:
  - hostPath:
      path: /var/log/kube-etcd.log
    name: logfile
  - hostPath:
      path: /var/etcd/data
    name: varetcd
  - hostPath:
      path: /etc/ssl/certs
    name: certs
  - hostPath:
      path: /etc/kubernetes/
    name: k8s
status: {}

3台master机器 重复操作3.1-3.2,

参数说明

  • –name=etcd0 每个etcd name都是唯一

  • client-urls 修改对应的机器ip

kubelet 会定时查看manifests目录,拉起 里面的配置文件

3.3 安装kube-apiserver

创建kube-apiserver.yaml,并放到 /etc/kubernetes/manifests

#根据挂载配置创建相关目录
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    component: kube-apiserver
    tier: control-plane
  name: kube-apiserver
  namespace: kube-system
spec:
  hostNetwork: true
  containers:
  - command:
    - /bin/sh
    - -c
    - /usr/local/bin/kube-apiserver
      --kubelet-https=true
      --enable-bootstrap-token-auth=true
      --token-auth-file=/etc/kubernetes/token.csv
      --service-cluster-ip-range=10.96.0.0/12
      --tls-cert-file=/etc/kubernetes/pki/kubernetes.pem
      --tls-private-key-file=/etc/kubernetes/pki/kubernetes-key.pem
      --client-ca-file=/etc/kubernetes/pki/ca.pem
      --service-account-key-file=/etc/kubernetes/pki/ca-key.pem
      --insecure-port=9080
      --secure-port=6443
      --insecure-bind-address=0.0.0.0
      --bind-address=0.0.0.0
      --advertise-address=master_IP
      --storage-backend=etcd3
      --etcd-servers=http://master_IP1:2379,http://master_IP2:2379,http://master_IP3:2379
      --admission-control=NamespaceLifecycle,LimitRanger,ServiceAccount,PersistentVolumeLabel,DefaultStorageClass,ResourceQuota,DefaultTolerationSeconds,NodeRestriction
      --allow-privileged=true
      --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
      --authorization-mode=Node,RBAC
      --v=2 1>>/var/log/kube-apiserver.log 2>&1
    image: foxchan/google_containers/kube-apiserver-amd64:v1.8.1
    livenessProbe:
      failureThreshold: 8
      httpGet:
        host: 127.0.0.1
        path: /healthz
        port: 6443
        scheme: HTTPS
      initialDelaySeconds: 15
      timeoutSeconds: 15
    name: kube-apiserver
    resources:
      requests:
        cpu: 250m
    volumeMounts:
    - mountPath: /etc/kubernetes/
      name: k8s
      readOnly: true
    - mountPath: /etc/ssl/certs
      name: certs
    - mountPath: /etc/pki
      name: pki
    - mountPath: /var/log/kube-apiserver.log
      name: logfile
  hostNetwork: true
  volumes:
  - hostPath:
      path: /etc/kubernetes
    name: k8s
  - hostPath:
      path: /etc/ssl/certs
    name: certs
  - hostPath:
      path: /etc/pki
    name: pki
  - hostPath:
      path: /var/log/kube-apiserver.log
    name: logfile
status: {}

参数说明:

  • –advertise-address 修改对应机器的ip
  • –enable-bootstrap-token-auth Bootstrap Token authenticator
  • –authorization-mode 授权模型增加了 Node 参数,因为 1.8 后默认 system:node role 不会自动授予 system:nodes 组
  • 由于以上原因,–admission-control 同时增加了 NodeRestriction 参数

检测:可以看到api已经正常

kubectl --server=https://master_IP:6443 
--certificate-authority=/etc/kubernetes/pki/ca.pem  
--client-certificate=/etc/kubernetes/pki/admin.pem 
--client-key=/etc/kubernetes/pki/admin-key.pem 
get componentstatuses
NAME                 STATUS      MESSAGE                                                                                        ERROR
controller-manager   Unhealthy   Get http://127.0.0.1:10252/healthz: dial tcp 127.0.0.1:10252: getsockopt: connection refused   
scheduler            Healthy     ok                                                                                             
etcd-1               Healthy     {"health": "true"}                                                                             
etcd-0               Healthy     {"health": "true"}                                                                             
etcd-2               Healthy     {"health": "true"}

3.4 安装kube-controller-manager

创建kube-controller-manager.yaml,并放到
/etc/kubernetes/manifests

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    component: kube-controller-manager
    tier: control-plane
  name: kube-controller-manager
  namespace: kube-system
spec:
  containers:
  - command:
    - /bin/sh
    - -c
    - /usr/local/bin/kube-controller-manager 
      --master=127.0.0.1:9080
      --controllers=*,bootstrapsigner,tokencleaner
      --root-ca-file=/etc/kubernetes/pki/ca.pem
      --cluster-signing-cert-file=/etc/kubernetes/pki/ca.pem
      --cluster-signing-key-file=/etc/kubernetes/pki/ca-key.pem
      --service-account-private-key-file=/etc/kubernetes/pki/ca-key.pem
      --leader-elect=true 
      --v=2 1>>/var/log/kube-controller-manager.log 2>&1
    image: foxchan/google_containers/kube-controller-manager-amd64:v1.8.1
    livenessProbe:
      httpGet:
        host: 127.0.0.1
        path: /healthz
        port: 10252
      initialDelaySeconds: 15
      timeoutSeconds: 15
    name: kube-controller-manager
    volumeMounts:
    - mountPath: /etc/kubernetes/
      name: k8s
      readOnly: true
    - mountPath: /var/log/kube-controller-manager.log
      name: logfile
    - mountPath: /etc/ssl/certs
      name: certs
    - mountPath: /etc/pki
      name: pki
  hostNetwork: true
  volumes:
  - hostPath:
      path: /etc/kubernetes
    name: k8s
  - hostPath:
      path: /var/log/kube-controller-manager.log
    name: logfile
  - hostPath:
      path: /etc/ssl/certs
    name: certs
  - hostPath:
      path: /etc/pki
    name: pki
status: {}

参数说明

  • –controllers=*,tokencleaner,bootstrapsigner 启用bootstrap token

3.5 安装kube-scheduler

3.5.1 配置scheduler.conf

cd /etc/kubernetes
export KUBE_APISERVER="https://master_VIP:6443"

# set-cluster
kubectl config set-cluster kubernetes 
  --certificate-authority=/etc/kubernetes/pki/ca.pem 
  --embed-certs=true 
  --server=${KUBE_APISERVER} 
  --kubeconfig=scheduler.conf

# set-credentials
kubectl config set-credentials system:kube-scheduler 
  --client-certificate=/etc/kubernetes/pki/scheduler.pem 
  --embed-certs=true 
  --client-key=/etc/kubernetes/pki/scheduler-key.pem 
  --kubeconfig=scheduler.conf

# set-context
kubectl config set-context system:kube-scheduler@kubernetes 
  --cluster=kubernetes 
  --user=system:kube-scheduler 
  --kubeconfig=scheduler.conf

# set default context
kubectl config use-context system:kube-scheduler@kubernetes --kubeconfig=scheduler.conf

scheduler.conf文件生成后将这个文件分发到各个Master节点的/etc/kubernetes目录下

3.5.2创建kube-scheduler.yaml,并放到 /etc/kubernetes/manifests

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    component: kube-scheduler
    tier: control-plane
  name: kube-scheduler
  namespace: kube-system
spec:
  hostNetwork: true
  containers:
  - command:
    - /bin/sh
    - -c
    - /usr/local/bin/kube-scheduler 
      --address=127.0.0.1
      --leader-elect=true 
      --kubeconfig=/etc/kubernetes/scheduler.conf 
      --v=2 1>>/var/log/kube-scheduler.log 2>&1
    image: foxchan/google_containers/kube-scheduler-amd64:v1.8.1
    livenessProbe:
      failureThreshold: 8
      httpGet:
        host: 127.0.0.1
        path: /healthz
        port: 10251
      initialDelaySeconds: 15
      timeoutSeconds: 15
    name: kube-scheduler
    resources:
      requests:
        cpu: 100m
    volumeMounts:
    - mountPath: /var/log/kube-scheduler.log
      name: logfile
    - mountPath: /etc/kubernetes/scheduler.conf
      name: kubeconfig
      readOnly: true
  volumes:
  - hostPath:
      path: /var/log/kube-scheduler.log
    name: logfile
  - hostPath:
      path: /etc/kubernetes/scheduler.conf
    name: kubeconfig
status: {}

到这里三个Master节点上的kube-scheduler部署完成,通过选举出一个leader工作。

查看kube-scheduler日志

 tail -f kube-scheduler.log
I1024 05:20:44.704783       7 event.go:218] Event(v1.ObjectReference{Kind:"Endpoints", Namespace:"kube-system", Name:"kube-scheduler", UID:"1201fc85-b7e1-11e7-9792-525400b406cc", APIVersion:"v1", ResourceVersion:"87114", FieldPath:""}): type: 'Normal' reason: 'LeaderElection' kvm-sh002154 became leader

查看Kubernetes Master集群各个核心组件的状态全部正常

kubectl get cs
NAME                 STATUS    MESSAGE              ERROR
controller-manager   Healthy   ok
scheduler            Healthy   ok
etcd-2               Healthy   {"health": "true"}
etcd-0               Healthy   {"health": "true"}
etcd-1               Healthy   {"health": "true"}

kubernetes 1.8 高可用安装(二)

2、设置kubeconfig

2.1 设置kubectl的kubeconfig(admin.conf)

# 设置集群参数
kubectl config set-cluster kubernetes 
  --certificate-authority=/etc/kubernetes/pki/ca.pem 
  --embed-certs=true 
  --server=https://master_VIP:6443 
  --kubeconfig=admin.conf


# 设置客户端认证参数
kubectl config set-credentials kubernetes-admin 
  --client-certificate=/etc/kubernetes/pki/admin.pem 
  --embed-certs=true 
  --client-key=/etc/kubernetes/pki/admin-key.pem 
  --kubeconfig=admin.conf

# 设置上下文参数
kubectl config set-context kubernetes-admin@kubernetes 
  --cluster=kubernetes 
  --user=kubernetes-admin 
  --kubeconfig=admin.conf

# 设置默认上下文
kubectl config use-context kubernetes-admin@kubernetes --kubeconfig=admin.conf

2.2 配置 bootstrap.kubeconfig

# 生成配置
cd /etc/kubernetes/
export BOOTSTRAP_TOKEN=$(head -c 16 /dev/urandom | od -An -t x | tr -d ' ')
export KUBE_APISERVER="https://master_VIP:6443"
echo "Token: ${BOOTSTRAP_TOKEN}"

# 生成token文件
cat > token.csv <<EOF
${BOOTSTRAP_TOKEN},kubelet-bootstrap,10001,"system:kubelet-bootstrap"
EOF

#设置集群参数
kubectl config set-cluster kubernetes 
  --certificate-authority=/etc/kubernetes/pki/ca.pem 
  --embed-certs=true 
  --server=${KUBE_APISERVER} 
  --kubeconfig=bootstrap.kubeconfig

# 设置客户端认证参数
 kubectl config set-credentials kubelet-bootstrap 
  --token=${BOOTSTRAP_TOKEN} 
  --kubeconfig=bootstrap.kubeconfig

# 设置上下文参数
 kubectl config set-context default 
  --cluster=kubernetes 
  --user=kubelet-bootstrap 
  --kubeconfig=bootstrap.kubeconfig

# 设置默认上下文
kubectl config use-context default --kubeconfig=bootstrap.kubeconfig

2.3生成kube-proxy.kubeconfig

#设置集群参数
kubectl config set-cluster kubernetes 
  --certificate-authority=/etc/kubernetes/pki/ca.pem 
  --embed-certs=true 
  --server=${KUBE_APISERVER} 
  --kubeconfig=kube-proxy.kubeconfig

# 设置客户端认证参数
kubectl config set-credentials kube-proxy 
  --client-certificate=/etc/kubernetes/pki/kube-proxy.pem 
  --client-key=/etc/kubernetes/pki/kube-proxy-key.pem 
  --embed-certs=true 
  --kubeconfig=kube-proxy.kubeconfig

# 设置上下文参数
kubectl config set-context default 
  --cluster=kubernetes 
  --user=kube-proxy 
  --kubeconfig=kube-proxy.kubeconfig

# 设置默认上下文
kubectl config use-context default --kubeconfig=kube-proxy.kubeconfig

kubernetes 1.8 高可用安装(一)

1、创建证书

1.1 安装cfssl工具

wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
chmod +x cfssl_linux-amd64 cfssljson_linux-amd64
mv cfssl_linux-amd64 /usr/local/bin/cfssl
mv cfssljson_linux-amd64 /usr/local/bin/cfssljson

1.2 生成ca证书

创建ca-config.json

{
  "signing": {
    "default": {
      "expiry": "87600h"
    },
    "profiles": {
      "kubernetes": {
        "usages": [
            "signing",
            "key encipherment",
            "server auth",
            "client auth"
        ],
        "expiry": "87600h"
      }
    }
  }
}

创建ca-csr.json

{
  "CN": "kubernetes",
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "BeiJing",
      "L": "BeiJing",
      "O": "k8s",
      "OU": "System"
    }
  ]
}

生成证书

cfssl gencert -initca ca-csr.json | cfssljson -bare ca

查看ca证书

ca-config.json  ca.csr  ca-csr.json  ca-key.pem  ca.pem

1.3 生成kubernetes证书

创建kubernetes-csr.json

{
    "CN": "kubernetes",
    "hosts": [
        "127.0.0.1",
        "10.96.0.1",
        "master_ip1",
        "master_ip2",
        "master_ip3",
        "master_VIP",
        "localhost",
        "kubernetes",
        "kubernetes.default",
        "kubernetes.default.svc",
        "kubernetes.default.svc.cluster",
        "kubernetes.default.svc.cluster.local"
    ],
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "ST": "BeiJing",
            "L": "BeiJing",
            "O": "k8s",
            "OU": "System"
        }
    ]
}

master_IP :就是准备跑master的机器

10.96.0.1 : 是集群ip,根据自己环境去修改

生成证书

cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kubernetes-csr.json | cfssljson -bare kubernetes

查看证书

kubernetes.csr  kubernetes-csr.json  kubernetes-key.pem  kubernetes.pem

1.4生成admin证书

cat <<EOF > admin-csr.json
{
  "CN": "admin",
  "hosts": [],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "BeiJing",
      "L": "BeiJing",
      "O": "system:masters",
      "OU": "System"
    }
  ]
}
EOF

生成证书

cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes admin-csr.json | cfssljson -bare admin

1.5 创建kube-controller-manager客户端证书和私钥

创建controller-manager-csr.json

{
  "CN": "system:kube-controller-manager",
  "hosts": [
      "master_ip1",
      "master_ip2",
      "master_ip3",
      "master_VIP"
  ],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "BeiJing",
      "L": "BeiJing",
      "O": "system:kube-controller-manager",
      "OU": "System"
    }
  ]
}

生成证书和私钥:

cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes controller-manager-csr.json | cfssljson -bare controller-manager

1.6 创建kube-scheduler客户端证书和私钥

创建scheduler-csr.json

{
  "CN": "system:kube-scheduler",
  "hosts": [
      "master_ip1",
      "master_ip2",
      "master_ip3",
      "master_VIP"
  ],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "BeiJing",
      "L": "BeiJing",
      "O": "system:kube-scheduler",
      "OU": "System"
    }
  ]
}

生成证书和私钥:

cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes scheduler-csr.json | cfssljson -bare scheduler

1.7 创建kube-proxy客户端证书和私钥

cat <<EOF > kube-proxy-csr.json
{
  "CN": "system:kube-proxy",
  "hosts": [],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "BeiJing",
      "L": "BeiJing",
      "O": "k8s",
      "OU": "System"
    }
  ]
}
EOF

生成证书

cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes  kube-proxy-csr.json | cfssljson -bare kube-proxy

1.8 密钥分发

将证书分发到各个机器

总的证书概览:

  • etcd:使用 ca.pem、kubernetes-key.pem、kubernetes.pem;
  • kube-apiserver:使用 ca.pem、kubernetes-key.pem、kubernetes.pem;
  • kubelet:使用 ca.pem;
  • kube-proxy:使用 ca.pem、kube-proxy-key.pem、kube-proxy.pem;
  • kubectl:使用 ca.pem、admin-key.pem、admin.pem;

证书后缀说明

  • 证书:.crt, .pem
  • 私钥:.key
  • 证书请求:.csr

kubernetes 1.8 高可用安装

1、如何获取rpm包,及制作kubernetes镜像

1.1 官方yum源,有翻墙能力的 请使用

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://yum.kubernetes.io/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

1.2 自行编译生成相关rpm包

下载源码包
git clone 
https://github.com/kubernetes/release
 kubeadm
cd kubeadm/rpm
sh docker-build.sh

结果在 rpm/output/x86_64/yum/

kubectl-1.8.2-0.x86_64.rpm
kubelet-1.8.2-0.x86_64.rpm
kubeadm-1.8.2-0.x86_64.rpm
kubernetes-cni-0.5.1-0.x86_64.rpm

期间会生成一个docker image叫kubelet-rpm-builder,也需要翻墙
我已上传自己私有仓

https://hub.docker.com/r/foxchan/kubelet-rpm-builder/

注意:如果提前下载好kubelet-rpm-builder,需要修改rpm目录下的docker-build.sh 和Dockerfile

Dockerfile修改如下:

FROM foxchan/kubelet-rpm-builder
USER root
ADD entry.sh /root/
COPY ./ /root/rpmbuild/SPECS
ENTRYPOINT ["/root/entry.sh"]

docker-build.sh

#!/bin/sh
set -e
echo "Cleaning output directory..."
sudo rm -rf output/*
mkdir -p output
docker run -ti --rm -v $PWD/output/:/root/rpmbuild/RPMS/ kubelet-rpm-builder $1
sudo chown -R $USER $PWD/output
echo
echo "----------------------------------------"
echo
echo "RPMs written to: "
ls $PWD/output/*/
echo
echo "Yum repodata written to: "
ls $PWD/output/*/repodata/

2、利用github,创建kubernetes镜像

2.1 Dockerfile上传到github

github上新建一个工程,https://github.com/foxchenlei/docker-library

然后在工程中新增: ./kube-apiserver-amd64/Dockerfile,Dockerfile内容为:

FROM gcr.io/google_containers/kube-apiserver-amd64:v1.8.2 
MAINTAINER FoxChan

2.2 Docker Hub上创建Automated build

到docker hub上,Create -> Create Automated Build,新增一个Github类型的自动编译,选择docker-library项目;修改Repository的Name为kube-apiserver-amd64,简单填下描述,这样就创建了一个Automated Build。

进到Repository kube-apiserver-amd64,Build Setting中填写Dockerfile Location为kube-apiserver-amd64,修改Docker Tag Name为1.8.2,Save Change and Trigger;然后点Build Details,可以看到build的过程,状态切为Success就可以了。

2.3 剩下的,就是重复上面的操作,把你需要的镜像全部构建到hub.docker.com,以后需要的时候 就pull下来

微服务架构日志集中化 安装 EFK (Fluentd ElasticSearch Kibana) 采集nginx日志

本文描述如何通过FEK组合集中化nginx的访问日志。本人更喜欢按顺序来命名,所以使用FEK而不是EFK.

首先在nginx服务器上执行以下操作.

安装ruby

http://blog.csdn.net/chenhaifeng2016/article/details/78678680

安装Fluentd

curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sh
systemctl start td-agent

安装插件

td-agent-gem install fluent-plugin-elasticsearch
td-agent-gem install fluent-plugin-typecast

安装ElasticSearch

下载软件包并解压

wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.0.0.tar.gz

创建组和用户

groupadd elsearch
useradd elsearch -g elsearch -p elsearch
chown -R elsearch:elsearch /usr/local/src/elsearch

编辑/etc/sysctl.conf

vm.max_map_count=655360

查看一下是否生效

sysctl -p

编辑/etc/security/limits.conf,在文件尾添加以下内容

elsearch soft nofile 65536
elsearch hard nofile 65536

编辑config/elasticsearch.yml,修改以下配置项

network.host: 0.0.0.0

切换到用户elsearch

su elsearch

运行elasticsearch

bin/elasticsearch

如果要以守护进程方式运行加上参数-d

未分类

安装Kibana

下载并解压缩文件。

wget https://artifacts.elastic.co/downloads/kibana/kibana-6.0.0-linux-x86_64.tar.gz

修改配置文件configkibana.yaml

server.port: 5601
server.host: "0.0.0.0"
elasticsearch.url: "http://localhost:9200"

运行kibana

bin/kibana

安装Logstash (这一步非必须)

下载并解压缩文件

wget https://artifacts.elastic.co/downloads/logstash/logstash-6.0.0.tar.gz

创建配置文件logstash.conf

<img src="http://devops.webres.wang/wp-content/uploads/2017/12/2-16.png" alt="" width="340" height="258" class="alignnone size-full wp-image-16270" />

运行./logstash -f logstash.conf

输入hello the world

未分类

在kibana创建索引模式

未分类

在kibana的Discover界面就可以看到信息了

未分类

接下来配置fluentd

编辑配置文件/etc/td-agent/td-agent.conf

[plain] view plain copy
<source>  
  @type tail  
  path /usr/local/nginx/logs/access.log  
  pos_file /usr/local/nginx/logs/access.log.pos  

  tag nginx.access  
  format /^(?<host>[^ ]*) [^ ]* (?<user>[^ ]*) 
(?<time>[^
]*)] "(?<method>S+)(?: +(?<path>[^ ]*) +S*)?" (?<code>[^ ]*) (?<size>[^ ]*)(?: "(?<referer>[^"]*)" "(?<agent>[^"]*)")?$/  
  time_format %d/%b/%Y:%H:%M:%S %z  
</source>  
<match nginx.access>  
  @type elasticsearch  
  host localhost  
  port 9200  
#  index_name fluentd  
  flush_interval 10s  
  logstash_format true  
#  typename fluentd  
</match>  

在/usr/local/nginx/logs/下面创建access.log.pos文件

touch access.log.pos

chmod a+rw access.log.pos

重启fluentd

systemctl restart fluentd

修改nginx.conf, 更改日志格式

[plain] view plain copy
log_format  main  '$remote_addr $http_host [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"';  

重启nginx

nginx -s reload

通过浏览器访问nginx

查看fluentd的日志

tail -f /var/log/td-agent/td-agent.log

说明fluent读取nginx的access.log成功并发给了elasticsearch.

在kibana查看日志

未分类

参考资料

正则表达式:http://fluentular.herokuapp.com/
http://blog.csdn.net/qq_27252133/article/details/53520416

补充说明:

采集端可以使用logstash, filebeat, 也可以使用fluentbit。因为fluent是CNCF的项目,所以只是为了了解一下。

centos iptables只允许某一ip访问某端口设置方法

首先,清除所有预设置

iptables -F

其次,设置只允许指定ip地址访问指定端口

1、在tcp协议中,禁止所有的ip访问本机的8080端口。

iptables -I INPUT -p tcp --dport 8080 -j DROP

2、允许192.168.1.123访问本机的1521端口

iptables -I INPUT -s 211.211.211.211 -p tcp --dport 8080 -j ACCEPT

最后,保存当前规则

/etc/rc.d/init.d/iptables save 
service iptables restart

添加后打开iptables后如图所示,

-A INPUT -s 192.168.1.123/32 -p tcp -m tcp --dport 1521 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 1521 -j DROP

未分类

Docker容器资源限制测试

Docker运行时的容器本质是进程。在Linux中,通过Namespace进行资源隔离,Cgroups进行资源限制。

一、Docker容器Cpu资源限制测试

容器资源CPU限制设置测试

默认所有的容器对于 CPU 的利用占比都是一样的,-c 或者 –cpu-shares 可以设置 CPU 利用率权重,默认为 1024,可以设置权重为 2 或者更高(单个 CPU 为 1024,两个为 2048,以此类推)。如果设置选项为 0,则系统会忽略该选项并且使用默认值 1024。通过以上设置,只会在 CPU 密集(繁忙)型运行进程时体现出来。当一个 container 空闲时,其它容器都是可以占用 CPU 的。cpu-shares 值为一个相对值,实际 CPU 利用率则取决于系统上运行容器的数量。

假如一个 1core 的主机运行 3 个 container,其中一个 cpu-shares 设置为 1024,而其它 cpu-shares 被设置成 512。当 3 个容器中的进程尝试使用 100% CPU 的时候「尝试使用 100% CPU 很重要,此时才可以体现设置值」,则设置 1024 的容器会占用 50% 的 CPU 时间。如果又添加一个 cpu-shares 为 1024 的 container,那么两个设置为 1024 的容器 CPU 利用占比为 33%,而另外两个则为 16.5%。简单的算法就是,所有设置的值相加,每个容器的占比就是 CPU 的利用率,如果只有一个容器,那么此时它无论设置 512 或者 1024,CPU 利用率都将是 100%。当然,如果主机是 3core,运行 3 个容器,两个 cpu-shares 设置为 512,一个设置为 1024,则此时每个 container 都能占用其中一个 CPU 为 100%。

1.1、通过参数–cpu-shares分配cpu使用权重

现在运行两个测试 container,一个权重设置为 2,一个权重设置 4,启动命令如下:

[root@ok188 ~]# docker run -it -d --cpu-shares 2 --name 2_cpu centos:7 /bin/bash
f3f125f7455974be77e58c0864d045b3b56ae2d007bd9095c47faca50893547c
[root@ok188 ~]# docker run -it -d --cpu-shares 4 --name 4_cpu centos:7 /bin/bash
5e623b55a22ef6d1e41e5978dd1c5d05d743b3a91498697db3b4b9c493f03f8b

通过压测工具如Stress进行压测,Stress使用实例:

  • 产生13个cpu进程4个io进程1分钟后停止运行
[root@ok188 ~]# stress -c 13 -i 4 --verbose --timeout 1m
  • 测试硬盘,通过mkstemp()生成800K大小的文件写入硬盘,对CPU、内存的使用要求很低
[root@ok188 ~]# stress -d 1 --hdd-noclean --hdd-bytes 800k
  • 产生13个进程,每个进程都反复不停的计算由rand ()产生随机数的平方根
[root@ok188 ~]# stress -c 13
  • 向磁盘中写入固定大小的文件,这个文件通过调用mkstemp()产生并保存在当前目录下,默认是文件产生后就被执行unlink(清除)操作,但是可以使用–hdd-bytes选项将产生的文件全部保存在当前目录下,这会将你的磁盘空间逐步耗尽
# 生成小文件
[root@ok188 ~]# stress -d 1 --hdd-noclean --hdd-bytes 13
# 生成大文件
[root@ok188 ~]# stress -d 1 --hdd-noclean --hdd-bytes 3G

对两个容器同时进行 CPU压测,在宿主机中查看两个容器CPU占用情况

[root@ok188 ~]# docker stats 2_cpu
CONTAINER      CPU %         MEM USAGE / LIMIT     MEM %      NET I/O         BLOCK I/O                 
2_cpu          33.31%        24.34MiB / 1.932GiB   1.23%     18.2MB / 322kB   49.1MB / 27.7MB
[root@ok188 ~]# docker stats 4_cpu
CONTAINER     CPU %         MEM USAGE / LIMIT     MEM %      NET I/O          BLOCK I/O                
4_cpu         65.96%        38.82MiB / 1.932GiB   1.96%     18.3MB / 451kB    8.19kB / 27.7MB

观察以上结果发现容器名为4_cpu权重比2_cpu大2倍,所以4_cpu可使用的cpu更多。
停止压测名为4_cpu的容器, 在宿主机中查看两个容器CPU占用情况

[root@ok188 ~]# docker stats 2_cpu
CONTAINER      CPU %         MEM USAGE / LIMIT     MEM %      NET I/O         BLOCK I/O                 
2_cpu          99.50%        24.34MiB / 1.932GiB   1.23%     18.2MB / 322kB   49.1MB / 27.7MB
[root@ok188 ~]# docker stats 4_cpu
CONTAINER     CPU %         MEM USAGE / LIMIT     MEM %      NET I/O          BLOCK I/O                
4_cpu         0.00%         37.5MiB / 1.932GiB   1.90%     18.3MB / 452kB    8.19kB / 27.7MB

结论参数cpu-shares 只是设置cpu使用权重,只会在 CPU 密集(繁忙)型运行进程时体现出来。当一个 container 空闲时,其它容器都是可以占用 CPU 的。
备注:物理主机为多核的情况下,显示的cpu使用比例有差异,本人测试主机为单核。

1.2、通过 –cpu-period & –cpu-quota 限制容器的 CPU 使用上限

默认的 CPU CFS「Completely Fair Scheduler」period 是 100ms。我们可以通过 –cpu-period 值限制容器的 CPU 使用。一般 –cpu-period 配合 –cpu-quota 一起使用。

为啥把这两个参数放一起呢?因为这两个参数是相互配合的,–cpu-period和–cpu-quota的这种配置叫Ceiling Enforcement Tunable Parameters,–cpu-shares的这种配置叫Relative Shares Tunable Parameters。–cpu-period是用来指定容器对CPU的使用要在多长时间内做一次重新分配,而–cpu-quota是用来指定在这个周期内,最多可以有多少时间用来跑这个容器。跟–cpu-shares不同的是这种配置是指定一个绝对值,而且没有弹性在里面,容器对CPU资源的使用绝对不会超过配置的值。

设置 cpu-period 为 100000,cpu-quota 为 50000,表示最多可以使用 cpu到50%。

[root@nsj-13-58 ~]# docker run -it --cpu-period=100000 --cpu-quota=50000 --name 0.5_p_cpu centos:7 /bin/bash

压测容器,并查看CPU占用情况:

[root@ok188 ~]# docker stats 0.5_p_cpu
CONTAINER       CPU %     MEM USAGE / LIMIT     MEM %         NET I/O             BLOCK I/O
0.5_p_cpu       50.33%    22.12MiB / 1.932GiB   1.12%         18.3MB / 348kB      524kB / 27.7MB

通过以上测试可以得知,–cpu-period 结合 –cpu-quota 配置是固定的,无论宿主机系统 CPU 是闲还是繁忙,如上配置,容器最多只能使用 CPU 到 50%。

二、Docker容器Memory资源限制测试

默认启动一个container,对于容器的内存是没有任何限制的。

2.1、默认启动一个 container,对于容器的内存是没有任何限制的。

[root@ok188 ~]# docker run -it -d --name no_limit_memory centos:7 /bin/bash
[root@ok188 ~]# docker stats no_limit_memory
CONTAINER           CPU %      MEM USAGE / LIMIT   MEM %      NET I/O             BLOCK I/O
no_limit_memory     0.00%      932KiB / 1.932GiB   0.05%      586B / 0B           8.19kB / 0B         
[root@ok188 ~]# free -g
              total        used        free      shared  buff/cache   available
Mem:              1           0           0           0           1           1
Swap:             1           0           1

MEM LIMIT显示的是容器宿主机的内存大小,Mem+Swap的总大小

2.2、通过 -m 参数限制内存大小

设置-m值为500Mb,表示容器程序使用内存受限。按照官方文档的理解,如果指定 -m 内存限制时不添加 –memory-swap 选项,则表示容器中程序可以使用 500m内存和500m swap 内存。那么容器里程序可以跑到500m*2=1g后才会被oom给杀死。

[root@ok188 ~]# docker run -it -d -m 500m --name limit_memory_1 centos:7 /bin/bash     
21eb95cffa45972603cb0e67b7ee0724d019cd7182fa5668bf07665ddf4f83cc
[root@ok188 ~]# docker stats limit_memory_1
CONTAINER           CPU %       MEM USAGE / LIMIT   MEM %      NET I/O             BLOCK I/O
limit_memory_1      0.00%       916KiB / 500MiB       0.09%      586B / 0B           0B / 0B

在libcontainer源码里

memory.memsw.limit_in_bytes

值是被设置成我们指定的内存参数的两倍。

其中代码如下:

// By default, MemorySwap is set to twice the size of RAM.
// If you want to omit MemorySwap, set it to `-1'.
if d.c.MemorySwap != -1 {
if err := writeFile(dir, "memory.memsw.limit_in_bytes", strconv.FormatInt(d.c.Memory*2, 10)); err != nil {
return err
}

使用压测工具进行压测,当压测值是 memory + swap之和上限时,则容器中的进程会被直接 OOM kill。

2.3、参数–memory-swappiness=0 表示禁用容器 swap 功能。

[root@ok188 ~]# docker run -it -d -m 500m --memory-swappiness=0 --name limit_memory_noswap_1 centos:7 /bin/bash

使用压测工具进行压测,当压测值是 1G ,则容器中的进程会被直接 OOM kill。查看容器内系统日志:

2.4、指定限制内存大小并且设置 memory-swap 值为 -1

表示容器程序使用内存受限,而 swap 空间使用不受限制(宿主 swap 支持使用多少则容器即可使用多少。如果 –memory-swap 设置小于 –memory 则设置不生效,使用默认设置)。–memory-swap -1

[root@ok188 ~]# docker run -it -d -m 500m --memory-swap -1  --name limit_memory_2 centos:7 /bin/bash

2.5、指定限制内存大小并且设置 memory-swap 值

指定限制内存大小500Mb并且设置 memory-swap 值400Mb当压测值是900Mb时,则容器中的进程会被直接 OOM kill。

[root@ok188 ~]# docker run -it -d -m 500m --memory-swap 400m  --name limit_memory_3 centos:7 /bin/bash

备注:实际生产环境不推荐使用swap功能,建议直接禁用swap功能。

2.6、参数–oom-kill-disable ,加上之后则达到限制内存之后也不会被 kill

正常情况不添加 –oom-kill-disable 容器程序内存使用超过限制后则会直接 OOM kill,加上之后则达到限制内存之后也不会被 kill。

[root@ok188 ~]# docker run -it -d -m 500m --oom-kill-disable --name limit_memory_4 centos:7 /bin/bash

==注意如果是以下的这种没有对容器作任何资源限制的情况,添加 –oom-kill-disable 选项就比较危险了:==

[root@ok188 ~]# docker run -it -d --oom-kill-disable --name limit_memory_5 centos:7 /bin/bash

因为此时容器内存没有限制,使用的上限值是物理内存的上限值。 并且不会被 oom kill,此时系统则会 kill 系统进程用于释放内存。

后记:目前 Docker 支持的资源限制选项

未分类

附Docker容器限制源码路径:

github.com/opencontainers/runc/libcontainer/cgroups/fs

Ubuntu 17.10 用 apt 搭建 lamp 环境、安装 phpmyadmin、redis 服务+扩展、mysql 扩展、开启错误提示、配置虚拟主机

一、最终环境

Ubuntu17.10、Apache2.4.27、MySQL5.7.20、PHP7.1.8

二、安装 apache

官方源有,直接安装:

sudo apt-get install apache2

三、安装 mysql

官方源有,直接安装:

sudo apt-get install mysql-server

安装期间会提示设置 MySQL administrator 的密码

============================================

PS:需要什么软件或包,直接用 apt-cache 搜索

apt-cache search <关键词>

确认包名后,直接用 apt-get install 安装。

四、安装 php

官方源有 php7.1,直接安装:

sudo apt-get install php7.1 php7.1-dev

注意带上版本号,不然默认安装 7.x。php7.1 是主程序,php7.1-dev 是 7.1 版的开发包(有 phpize、php-config 等等,phpize 可以为 已编译好的 php 加载外挂模块,php-config 可以获得 php 的详细配置)。

============================================

如果要装 php5.6 的话,推荐这个 PPA 源:ppa:ondrej/php。这个源有 php5.6 和 php7.x 以及绝大多数的 php 扩展,包括 redis、memcache、mongodb 等等。

添加 ppa:ondrej/php 源:

sudo add-apt-repository ppa:ondrej/php
sudo apt-get update

安装 php5.6:

sudo apt-get install php5.6 php5.6-dev

五、重启 apache

sudo /etc/init.d/apache2 restart

更多选项:

Usage: apache2 {start|stop|graceful-stop|restart|reload|force-reload}

六、检查 apache

访问 http://localhost/。这是 apache 服务器的默认页在 /var/www/html 下,里面还介绍了 apche 的相关配置文件。

未分类

七、检查 mysql

终端输入 mysql,跟着打两个 Tab,看到所有有关 mysql 的命令包:

mingc@mingc-GE60-2PL:~$ mysql
mysql                      mysql_install_db
mysqladmin                 mysqloptimize
mysqlanalyze               mysql_plugin
mysqlbinlog                mysqlpump
mysqlcheck                 mysqlrepair
mysql_config_editor        mysqlreport
mysqld                     mysql_secure_installation
mysqld_multi               mysqlshow
mysqld_safe                mysqlslap
mysqldump                  mysql_ssl_rsa_setup
mysqldumpslow              mysql_tzinfo_to_sql
mysql_embedded             mysql_upgrade
mysqlimport               

输入 mysql -u<你的账号> -p ,回车,输入密码,进入 mysql:

mingc@mingc-GE60-2PL:~$ mysql -uroot -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or g.
Your MySQL connection id is 73
Server version: 5.7.20-0ubuntu0.17.10.1 (Ubuntu)

Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.

mysql>

八、检查 php

php -v

不出意外的话,应该显示 php 的版本

============================================

也可以查看 apache 和 mysql 版本:

apache2 -v
mysql -V

九、创建 php 探针

sudo vim /var/www/html/info.php

添加如下内容:

<?php
phpinfo();

改变所有者:

sudo chown www-data:www-data /var/www/html/info.php

访问 http://localhost/info.php,得到有关 PHP 的详细页面。

未分类

十、安装 phpmyadmin

sudo apt-get install phpmyadmin

安装期间,

询问要连接的服务器,选择 apache2;

询问创建 phpmyadmin 的数据库,选择“是”;

询问设置登录 phpmyadmin 的用户和密码。

然后浏览器访问:http://localhost/phpmyadmin

未分类

十一、安装 redis 服务和 redis 扩展

官方源有,直接安装:

(1)redis 服务器

sudo apt-get install redis-server

期间,一些需要的工具包也会自动安装。安装好后,默认自启动、后台运行,配置文件在 /etc/redis 目录下。

(2)php 的 redis 扩展模块

sudo apt-get install php-redis

其他的扩展也可以这么装,利用 apt-cache search 搜索包名,再用 apt-get install 安装。

重启 apche, sudo /etc/init.d/apache2 restart

访问 http://localhost/info.php,确认 redis 扩展:

未分类

测试一下:

终端输入 redis-,跟着打两个 Tab 键,看到有关 redis 的命令和工具:

mingc@mingc-GE60-2PL:~$ redis-
redis-benchmark  redis-check-rdb  redis-server    
redis-check-aof  redis-cli

redis-cli 是 访问 redis-server 的客户端接口,执行 redis-cli 即可登录到 redis 服务器:

mingc@mingc-GE60-2PL:~$ redis-cli
127.0.0.1:6379>

更多 redis-cli 的命令选项,使用 redis-cli –help 查看。

再写一段 php 脚本测试一下, vim /var/www/html/test_redis.php

内容如下:

<?php
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
echo "Connection to server sucessfully";
echo "Server is running: " . $redis->ping(); 

十二、安装 mysql 扩展

在上面的 http://localhost/info.php 里可以看到,没有 mysql 扩展。虽说 php7 弃用了 mysql 扩展,但有些旧项目还是需要的。装一下 mysql 扩展。

这里选择编译安装(通过 apt 安装的 php-mysql 扩展,如果是 php7.x,那就是装 pdo 和 pdo_mysql 扩展)

(1)直接从 PECL 官方站 搜索 mysql,找到 MySQL 扩展的 页面 ,点击页面的 [ Browse Source ],选择最新的 commit、下载 tar.gz 包。我下载后的包名为 mysql-fae9884.tar.gz。

(2)编译安装:

tar -xf mysql-fae9884.tar.gz
cd mysql-fae9884
phpize
./configure --with-php-config=/usr/bin/php-config
sudo make && sudo make install

前面装 php7.1 的时候,也装了 php7.1-dev,这里面就有 phpize 和 php-config。而 –with-php-config 是 php-config 程序(命令)的位置,可以使用 whereis php-config 查看。

编译安装成功后,会有成功提示 和 mysql 扩展模块(.so 文件)的路径:

Build complete.
Don't forget to run 'make test'.

Installing shared extensions:     /usr/lib/php/20160303/  

然后,编辑 php 用于 apache 的配置文件 /etc/php/7.1/apache2/php.ini,在最后添加一行:

extension=mysql.so

重启 apache, sudo /etc/init.d/apache2 restart

访问 http://localhost/info.php,确认下有了 mysql 扩展。

未分类

写一段 php 脚本测试: vim /etc/www/html/test_mysql.php

内容如下:

<?php
$mysql = mysql_connect('127.0.0.1', 'root', 'root');
if(!$mysql) {
    die(mysql_error($mysql));
}
echo 'Ok' . "rn";

由于 mysql 模块是手动编译安装的,所以默认不会进入 php 的命令行配置。

下面把 mysql 模块加入到 php 的 cli(命令行) 配置,让 php 的命令行模式也支持 mysql 模块:

sudo vim /etc/php/7.1/mods-available/mysql.ini

编辑内容如下:

extension=mysql.so

建立符号链接:

sudo ln -s /etc/php/7.1/mods-available/mysql.ini /etc/php/7.1/cli/conf.d/mysql.ini

检查一下,确认 php 命令行模式启用了 mysql 扩展模块:

php -m | grep mysql  

十三、开启 php 和 apache 的错误提示

默认不显示 php 错误,下面开启。

(1)修改 php 的配置文件,在 /etc/php/7.1/apache2 下,打开 php.ini。

(2)搜索 display_errors = Off,修改为 On

(3)搜索 error_reporting = E_ALL & ~E_NOTICE,修改为 E_ALL | E_STRICT(搜不到的话就搜短一点:“error_reporting =”)。

(4)修改 apache 的配置文件,在 /etc/apache2 下,打开 apache.conf。

(5)文件最后添加两行:

php_flag display_errors        on
php_value error_reporting       2039

(6)重启 apache:

sudo /etc/init.d/apache2 restart

十四、创建虚拟主机

创建虚拟主机自然用 apache 配置,了解一下 apache 的配置目录:

/etc/apache2
├── apache2.conf      # 主配置文件,其他的一些配置文件通过 Include 指令包含进来
├── conf-available    # 所有可用的配置文件(里面的 *.conf 文件内容几乎都被默认注释了)
├── conf-enabled      # 可用的配置文件中,启用了哪些,一般都是符号链接、指向上面的 conf-available 目录里每个 *.conf 文件
├── envvars           # 环境变量
├── magic
├── mods-available    # 所有可用的模块
├── mods-enabled      # 哪些模块被启用了
├── ports.conf        # 定义端口监听
├── sites-available   # 重点来了:所有可用的站点
└── sites-enabled     # 哪些站点被启用了

步骤简单,就是在 sites-available 目录定义站点配置文件,然后在 sites-enabled 里建立指向这个配置文件的符号链接。

(1)建配置

cd /etc/apache2/sites-available/
sudo cp 000-default.conf my.site.conf
vim my.site.conf

修改如下(注意别把注释与指令行放在一行,不然会有语法错误;精简版在后面):

<VirtualHost *:80>
    # The ServerName directive sets the request scheme, hostname and port that
    # the server uses to identify itself. This is used when creating
    # redirection URLs. In the context of virtual hosts, the ServerName
    # specifies what hostname must appear in the request's Host: header to
    # match this virtual host. For the default virtual host (this file) this
    # value is not decisive as it is used as a last resort host regardless.
    # However, you must set it for any further virtual host explicitly.

    # 域名
    ServerName my.site
    # 域名别名,可以设置多个,空格隔开
    ServerAlias my.site

    ServerAdmin webmaster@localhost

    # 站点根目录
    DocumentRoot /var/www/my.site
    <Directory "/var/www/my.site/">
        # 启用符号链接
        Options FollowSymLinks

        DirectoryIndex index.php index.html index.htm

        # 注意这个配置,会影响本地目录下的 .htaccess 的启用
        AllowOverride All

        Order deny,allow
        Allow from All

        # 限制访问目录,多个目录用冒号隔开
        # php_admin_value open_basedir "/var/www/my.site/:/tmp:/usr/lib/php/"
    </Directory>

    # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
    # error, crit, alert, emerg.
    # It is also possible to configure the loglevel for particular
    # modules, e.g.
    #LogLevel info ssl:warn

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    # For most configuration files from conf-available/, which are
    # enabled or disabled at a global level, it is possible to
    # include a line for only one particular virtual host. For example the
    # following line enables the CGI configuration for this host only
    # after it has been globally disabled with "a2disconf".
    #Include conf-available/serve-cgi-bin.conf
</VirtualHost>

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

精简版(去掉了多余注释):

<VirtualHost *:80>
    ServerName my.site
    ServerAlias my.site
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/my.site
    <Directory "/var/www/my.site/">
        Options FollowSymLinks
        DirectoryIndex index.php index.html index.htm
        AllowOverride All
        Order deny,allow
        Allow from All
        # php_admin_value open_basedir "/var/www/my.site/:/tmp:/usr/lib/php/"
    </Directory>
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

(2)建符号链接

sudo ln -s /etc/apache2/sites-available/my.site.conf /etc/apache2/sites-enabled/my.site.conf

(3)检查语法

终端执行:

apachectl configtest

(4)添加 hosts 解析

vim /etc/hosts ,添加一行:

127.0.0.1   my.site

(5)重启 apache

sudo /etc/init.d/apache2 restart

然后,按照配置的站点目录 /etc/www/my.site,创建目录和测试文件:

sudo makedir -p /etc/www/my.site
cd /etc/www/my.site/
sudo echo "<h2>Welcome to my.site!</h2>" > index.html

浏览器访问 http://my.site,

未分类

OK,完成~~

十五、相关链接

PHP 及扩展的 PPA 源:https://launchpad.net/~ondrej/+archive/ubuntu/php/+index?batch=75&memo=75&start=75

centos7下部署iptables环境纪录(关闭默认的firewalle)

CentOS7默认的防火墙不是iptables,而是firewall.
由于习惯了用iptables作为防火墙,所以在安装好centos7系统后,会将默认的firewall关闭,并另安装iptables进行防火墙规则设定

下面介绍centos7关闭firewall安装iptables,并且开启80端口、3306端口的操作记录:

[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)

1、关闭firewall:

[root@localhost ~]# systemctl stop firewalld.service            //停止firewall
[root@localhost ~]# systemctl disable firewalld.service        //禁止firewall开机启动

2、安装iptables防火墙

[root@localhost ~]# yum install iptables-services            //安装
[root@localhost ~]# vim /etc/sysconfig/iptables              //编辑防火墙配置文件
# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
[root@localhost ~]# systemctl restart iptables.service                  //最后重启防火墙使配置生效
[root@localhost ~]# systemctl enable iptables.service                  //设置防火墙开机启动
[root@localhost ~]# iptables -L                 //查看防火墙规则,默认的是-t filter,如果是nat表查看,即iptables -t nat -L

3、关闭SELINUX

[root@localhost ~]# vim /etc/selinux/config
#SELINUX=enforcing           //注释掉
#SELINUXTYPE=targeted           //注释掉
SELINUX=disabled              //增加
[root@localhost ~]# setenforce 0       //使配置立即生效

docker容器跨服务器的迁移方式export和save

程序放在docker里面迁移起来很是方便,像是以前的话,需要重新部署环境和静态文件。 放在docker里面的话,只是需要export备份封装后,scp、rsync迁移到别的服务器就可以了。

[root@zhdy01 ~]# docker ps -a

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

6712e7adee85        665e                "/bin/bash"         28 seconds ago      Up 24 seconds                           youthful_perlman

[root@zhdy01 ~]# docker export 6712 > centos7_nginx.tar

[root@zhdy01 ~]# du -sh centos7_nginx.tar 

359M centos7_nginx.tar

然后把这个centos7_nginx.tar 传到别的服务器上。

[root@zhdy01 ~]# cat centos7_nginx.tar |docker import - c7_nginx
sha256:da676fc85a74162743df4d18d7983017e011b288a95cc503edd4fe229f207d25
[root@zhdy01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
c7_nginx latest da676fc85a74 8 seconds ago 364MB
centos7_nginx latest 665e56a46000 6 days ago 385MB

上面的方式是用docker export。 export是当前的状态,docker save 是针对镜像images。

主要的区别是 save是可以回滚以前的配置。 export 只是当前的。

咱们用save 看看备份效果。 是1.1G ,这里是包含那些记录的。刚才咱们用export测试的时候,会发现文件只有300M左右。

来看看效果:(漫长的等待。。。)

[root@zhdy01 ~]# docker save centos7_nginx >centos7_nn.tar
[root@zhdy01 ~]# du -sh *
273M centos7_net.tar
359M centos7_nginx.tar
1.1G centos7_nn.tar

我估计如果有分布式文件系统 ,比如mfs,nfs。可以更好的试试用docker的数据卷来做本地文件夹和容器内的关联。 这样的话,备份更加自定义了。 毕竟环境这东西不会变,变的只是data数据,然后文件目录又在分布式文件里面,可以更好做迁移。只要那边启动一个环境,目录一关联就可以了。

备份迁移的方式自己选,推荐用export,毕竟save太大了,对于历史也没啥用处 !

对于数据安全关注更深的话,可以用docker volumes这样的数据映射。