প্রিভিলেজড ডকার কনটেইনার সহ কার্নেল টিউনিং


10

আমি লোড ব্যালেন্সারের জন্য কার্নেল সেটিংস টিউন করার জন্য একটি ধারক তৈরি করছি। আমি একক সুবিধাযুক্ত ধারক ব্যবহার করে কোনও চিত্রের মধ্যে হোস্টে এই পরিবর্তনগুলি স্থাপন করতে পছন্দ করব। উদাহরণ স্বরূপ:

docker run --rm --privileged ubuntu:latest sysctl -w net.core.somaxconn=65535

পরীক্ষায় পরিবর্তনগুলি কার্যকর হয় তবে কেবল সেই ধারকটির জন্য। আমার ধারণা ছিল যে পুরোপুরি অধিকারযুক্ত ধারক / প্রোকে পরিবর্তন করে আসলে অন্তর্নিহিত ওএস পরিবর্তন করবে।

$docker run --rm --privileged ubuntu:latest \
    sysctl -w net.core.somaxconn=65535
net.core.somaxconn = 65535

$ docker run --rm --privileged ubuntu:latest \
    /bin/bash -c "sysctl -a | grep somaxconn"
net.core.somaxconn = 128

সুবিধাযুক্ত পাত্রে কী এভাবে কাজ করার কথা?

আমি কি নির্বোধ কিছু করছি?

স্থায়ী পরিবর্তনগুলি করার সর্বোত্তম উপায় কী?

ভার্সন তথ্য:

Client version: 1.4.1
Client API version: 1.16
Go version (client): go1.3.3
Git commit (client): 5bc2ff8
OS/Arch (client): linux/amd64
Server version: 1.4.1
Server API version: 1.16
Go version (server): go1.3.3
Git commit (server): 5bc2ff8

মাউন্ট / প্রোক সহ উদাহরণ কমান্ড:

$ docker run -v /proc:/proc ubuntu:latest \
    /bin/bash -c "sysctl -a | grep local_port"
net.ipv4.ip_local_port_range = 32768    61000

$ docker run -v /proc:/proc --privileged ubuntu:latest \
    /bin/bash -c "sysctl -p /updates/sysctl.conf"
net.ipv4.ip_local_port_range = 2000 65000

$ docker run -v /proc:/proc ubuntu:latest \
    /bin/bash -c "sysctl -a | grep local_port"
net.ipv4.ip_local_port_range = 32768    61000

$ docker run -v /proc:/proc --privileged ubuntu:latest \
    /bin/bash -c "sysctl -a | grep local_port"
net.ipv4.ip_local_port_range = 32768    61000

আমার কি ভলিউম হিসাবে মাউন্ট / প্রোকের মতো নির্বোধ কিছু করার দরকার আছে?
allingeek

কোন ভাগ্য ছাড়াই মাউন্টিং / প্রোক: / প্রোক চেষ্টা করা হয়েছে। সিস্টেস্ট-এ পরবর্তী কলগুলি মূল মানগুলি ফেরত দেয়।
allingeek

দেখে মনে হচ্ছে এখন এটি ডকার 18.09-এ কাজ করে
জাইরো আন্দ্রেস ভেলাস্কো রোমেরো

উত্তর:


8

এই নির্দিষ্ট সেটিংসটি ডকারের মধ্যে থাকা নেটওয়ার্ক নেমস্পেসের প্রভাবে পড়ে।

একটি সাধারণ নিয়ম হিসাবে /procসিস্টেমভিত্তিক রিলেভেন্ট সেটিংগুলিকে পরিবর্তিত করে, প্রযুক্তিগতভাবে বলতে গেলে আপনি সেটিংস পরিবর্তন করছেন /proc/netযা প্রতি নেটওয়ার্ক নেমস্পেসের ভিত্তিতে ফলাফল দেয়।

মনে রাখবেন যে /proc/netএটি আসলে আপনি একটি সিমলিংক /proc/self/netহিসাবে এটি বাস্তবে আপনি যে কাজটি করছেন সেই নেমস্পেসের সেটিংসগুলিকে প্রতিফলিত করে।


সুতরাং, আমি যদি / প্যাকটি মাউন্ট এবং - নেট হোস্ট সহ একটি ধারকটিতে এই পরিবর্তনগুলি করি তবে আমি হোস্টে পরিবর্তন আনতে পারি। তবে আমি যদি আপনার উত্তরটি বুঝতে পারি তবে পরবর্তী পাত্রে তার নিজের পুরানো মানগুলি (হোস্টের অবিরাম সেটিংস থেকে বুটস্ট্র্যাপড) বজায় রাখা হবে name লোড ব্যালান্সারের ধারকটিতে রানটাইমের সময় একই পরিবর্তন করতে আমাকে সেই ধারকটি চালানো দরকার CAP_NET_ADMIN এর মতো কিছু দিয়ে। ঠিক আছে?
allingeek

হ্যাঁ, CAP_NET_ADMIN এর সাথে দৌড়ানোর ক্ষেত্রে আপনি কোনও নাম স্থানটি ইনস্ট্যান্ট করে রেখেছেন এমন কোনও সমস্যা হওয়া উচিত নয়।
ম্যাথু ইফি 13

ম্যাথিউ_এফ এই ক্ষেত্রে কোনও বিষয় নয় যে ধারকটি সুবিধাপ্রাপ্ত হবে বলে আশা করা হচ্ছে। এটা আমার মনে হচ্ছে যে CAP_NET_ADMIN (অন্তত ধারক তার ইন্টারফেস পুনরায় কনফিগার পারে অন্য ধারক ছদ্মবেশ ধারণ করার) Docker confination থেকে পলায়নের অনুমতি দিতে পারে
এঞ্জেল

@ অ্যাঞ্জেল যা ডকারের ভিতরে কী লিঙ্ক আউট সেটআপ করছে তার উপর নির্ভর করবে। সাধারণত একজনকে অভিভাবক নেমস্পেসে ট্র্যাফিক প্রয়োগ করতে হবে। অন্য যে কোনও জায়গায় নেমস্পেসগুলি স্যুইচ করা সম্ভব হবে না কারণ এর জন্য আপনার CAP_SYS_ADMIN দরকার।
ম্যাথু ইফে

--Net = হোস্ট ব্যবহার করে কি কাজ করবে?
জাইরো আন্দ্রেস ভেলাস্কো রোমেরো

7

ডকার 1.12+ এর পাত্রে অভ্যন্তরীণ সিস্টেস্টাল মানগুলি টুইটারে নেটিভ সমর্থন রয়েছে। ডকুমেন্টেশনের একটি অংশ এখানে দেওয়া হয়েছে :

রানটাইম নেমস্পিডে কার্নেল প্যারামিটারগুলি (সিস্টেস্টাল) কনফিগার করুন

--Sysctl ধারকটিতে নেমস্পিডের কার্নেল প্যারামিটারগুলি (সিসেক্টলস) সেট করে। উদাহরণস্বরূপ, ধারক নেটওয়ার্ক নেমস্পেসে আইপি ফরওয়ার্ডিং চালু করতে, এই কমান্ডটি চালান:

docker run --sysctl net.ipv4.ip_forward=1 someimage

আপনার উদাহরণ ব্যবহার করে উত্থাপনের সঠিক উপায়টি হ'ল net.core.somaxconn:

docker run ... --sysctl net.core.somaxconn=65535 ...

3

সুবিধাযুক্ত ধারক এখনও তার নিজস্ব প্রক্রিয়া নেমস্পেসের জন্য ব্যবহার করছে /proc। আপনি যা করতে পারেন তা হ'ল /procধারকের ভিতরে আসল মাউন্ট করা :

docker run --rm --privileged -v /proc:/host-proc ubuntu:latest \
  'echo 65535 > /host-proc/sys/net/core/somaxconn'

শুধু এটি চেষ্টা করে দেখুন এটি কার্যকর হয় না।
allingeek

ছোট থেকেই আমি ডকার সম্পর্কে জানি; এটি একটি স্ব-অন্তর্ভুক্ত উদাহরণ হিসাবে মনে করা যেতে পারে, যেমন ফ্রিবিএসডি-তে জেলের মতো, তাই এটি সহজেই চারদিকে সরানো যায়, পুনর্বার নিয়োগ করা ইত্যাদি ... আপনার হোস্ট ওএসের সাথে ডকলেটটি মিশ্রিত করা উচিত নয়।
ডাচউঙ্কেল

2
- সুবিধাবঞ্চিত পাত্রে ব্যবহারের জন্য বেশ কয়েকটি বৈধ মামলা রয়েছে এবং এটিকে নিখুঁত ক্ষেত্রে বলে মনে হয়। সমস্ত পাত্রে একই অন্তর্নিহিত কার্নেল ব্যবহার করা হয়। স্ট্যান্ডার্ড পাত্রে কেবল পঠন হিসাবে মাউন্ট / প্রোক।
allingeek

@allingeek CAP_NET_ADMIN সত্যিই অনুপস্থিত বিট হতে পারে।
gelঞ্জেল

1
NET_ADMIN এর সাথে চেষ্টা করা হয়েছে এবং এটি এখনও কার্যকর হয় না - ডকার চালান - ক্যাপ-অ্যাড করুন NET_ADMIN --net = হোস্ট-ভি / প্রো: ip_forward '&& sysctl নেট.ipv4.ip_forward নেট.ipv4.ip_forward = 0
tomdee

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.